我正在运行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);
答案 0 :(得分:2)
在计算年龄之前,应先初始化当前和出生年份的值 :
currentyr = 2018;
birthyr = 2000;
age = currentyr - birthyr;
printf("I am %d years old", age);
现在最有可能发生的事情是,您的年龄差异是使用未定义的值或可能是随机值来计算的。
答案 1 :(得分:0)
but that still doesn't explain to me how the code still runs without error and produces 89...
C编译器提供了一组选项,可用于请求或禁止显示警告消息。例如如果您使用的是gcc
编译器,那么它将提供set of options,可在编译代码时使用。 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
选项将这些警告消息转换为错误。
如果未自动初始化具有自动存储期限的对象,则其值不确定。
在您的系统上,使用这些不确定值进行的计算得出结果89
。每次运行程序时,可能不会每次都得到结果89
。在我的系统上,我得到-
I am 218173908 years old
答案 2 :(得分:-1)
也许this问题可以给您答案。
为什么会继续?为什么会产生89?这是C语言标准和编译器的结果。