Это число было рассчитано или это случайный вывод? - PullRequest
0 голосов
/ 25 декабря 2018

Я использую C, и мне интересно, почему вывод для этого показывает "Мне 89 лет".Я получаю, что переменные currentyr и birthyr должны прийти раньше возраста, но это все еще не объясняет мне, как код по-прежнему работает без ошибок и выдает 89. Я пришел из ракетки, где, если что-то не так, все, что он делает, это даетя ошибаюсь, а не выдает случайный вывод, поэтому я немного растерялся.

int age;
int currentyr;
int birthyr;

age = currentyr - birthyr;
currentyr = 2018;
birthyr = 2000;

printf("I am %d years old", age);

Ответы [ 3 ]

0 голосов
/ 25 декабря 2018

Может быть этот вопрос может дать вам ответ.

Почему это продолжается?Почему он производит 89?Это результат стандарта языка Си и компилятора.

0 голосов
/ 25 декабря 2018

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
0 голосов
/ 25 декабря 2018

Вам следует инициализировать значения текущего и года рождения до вычисления возраста:

currentyr = 2018;
birthyr = 2000;
age = currentyr - birthyr;

printf("I am %d years old", age);

Скорее всего, сейчас происходит то, что ваша разница в возрасте вычисляется с неопределеннымили, возможно, случайные значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...