but that still doesn't explain to me how the code still runs without error and produces 89...
Компиляторы C предоставляют набор опций, которые вы можете использовать для запроса или подавления предупреждающих сообщений.Например, если вы используете компилятор gcc
, он предоставляет набор параметров , которые вы можете использовать при компиляции кода.Одним из параметров gcc
является -Wall
, который включает все предупреждения о конструкциях.Если вы компилируете свою программу с этим -Wall
, то компилятор выдаст предупреждение об использовании неинициализированной переменной в вашей программе:
# gcc -Wall prg.c
prg.c:8:7: warning: variable 'currentyr' is uninitialized when used here [-Wuninitialized]
age = currentyr - birthyr;
^~~~~~~~~
prg.c:5:14: note: initialize the variable 'currentyr' to silence this warning
int currentyr;
^
= 0
prg.c:8:19: warning: variable 'birthyr' is uninitialized when used here [-Wuninitialized]
age = currentyr - birthyr;
^~~~~~~
prg.c:6:12: note: initialize the variable 'birthyr' to silence this warning
int birthyr;
^
= 0
2 warnings generated.
См. Предупреждающие сообщения, относящиеся к переменным, неинициализированным при использовании.
Также,Вы можете преобразовать эти предупреждающие сообщения в ошибку, используя опцию -Werror
компилятора gcc
.
Из C Standards # 6.7.9p10 :
Еслиобъект, имеющий автоматическую продолжительность хранения, не инициализируется явно, его значение не определено.
В вашей системе вычисление с использованием этих неопределенных значений дает результат 89
.Вы можете не получить результат 89
каждый раз, когда запускаете вашу программу.В моей системе я получаю -
I am 218173908 years old