这个数字是计算出来的还是随机输出的?

时间:2018-12-25 04:59:37

标签: c

我正在运行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 :(得分: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选项将这些警告消息转换为错误。

来自C Standards#6.7.9p10

  

如果未自动初始化具有自动存储期限的对象,则其值不确定。

在您的系统上,使用这些不确定值进行的计算得出结果89。每次运行程序时,可能不会每次都得到结果89。在我的系统上,我得到-

I am 218173908 years old

答案 2 :(得分:-1)

也许this问题可以给您答案。

为什么会继续?为什么会产生89?这是C语言标准和编译器的结果。