Почему GCC только иногда обнаруживает использование переменной до ее инициализации? [Дубликат]
На этот вопрос уже есть ответ:
Компилятор не обнаруживает явно неинициализированную переменную 4 ответа Я читал какой-то код из книги, когда решил внести изменения, чтобы увидеть значение неинициализированногоsec
будет доwhile
заявление
#include<stdio.h>
#define S_TO_M 60
int main(void)
{
int sec,min,left;
printf("This program converts seconds to minutes and ");
printf("seconds. \n");
printf("Just enter the number of seconds. \n");
printf("Enter 0 to end the program. \n");
printf("sec = %d\n",sec);
while(sec > 0)
{
scanf("%d",&sec);
min = sec/S_TO_M;
left = sec % S_TO_M;
printf("%d sec is %d min, %d sec. \n",sec,min,left);
printf("Next input?\n");
}
printf("Bye!\n");
return 0;
}
Это компилируется в GCC без предупреждений, даже еслиsec
не инициализируется в этот момент, и я получаю значение32767
:
$ gcc -Wall test.c
$ ./a.out
This program converts seconds to minutes and seconds.
Just enter the number of seconds.
Enter 0 to end the program.
sec = 32767
Но когда я закомментируюwhile
заявление
#include<stdio.h>
#define S_TO_M 60
int main(void)
{
int sec;
//min,left;
printf("This program converts seconds to minutes and ");
printf("seconds. \n");
printf("Just enter the number of seconds. \n");
printf("Enter 0 to end the program. \n");
printf("sec = %d\n",sec);
/*
while(sec > 0)
{
scanf("%d",&sec);
min = sec/S_TO_M;
left = sec % S_TO_M;
printf("%d sec is %d min, %d sec. \n",sec,min,left);
printf("Next input?\n");
}
*/
printf("Bye!\n");
return 0;
}
Теперь GCC выдает предупреждение иsec
заканчивается нулем:
$ gcc -Wall test.c
test.c: In function ‘main’:
test.c:12:8: warning: ‘sec’ is used uninitialized in this function[-Wuninitialized]
printf("sec = %d\n",sec);
^
$ ./a.out
This program converts seconds to mintutes and seconds.
Just enter the number of seconds.
Enter 0 to end the program.
sec = 0
Bye!
Почему предупреждение появилось во второй раз, а не в первый раз?