为什么C中局部变量的默认值相同?

时间:2013-06-30 16:17:40

标签: c local-variables

#include <stdio.h>  
int main()
{
    int i,j=3;
    i=4+2*j/i-1;
    printf("%d",i);
    return 0;
}

每次打印9次,虽然我没有初始化, 所以, 它必须打印任何垃圾值。 请解释......

4 个答案:

答案 0 :(得分:8)

C中未初始化的局部变量的值是不确定的,读取它可以调用未定义的行为。

现在,在特定环境中重复执行使用特定编译器编译的特定程序(正如您所做)可能会产生同样的(当然还是未定义的)行为。这可能是因为操作系统通常会在每次运行时为您的进程提供相同范围的逻辑内存,因此程序读取的垃圾很可能每次都是相同的(但它仍然是垃圾)。或者它可能是因为编译器甚至懒得给你一个你将要阅读的垃圾的二进制表示,而是给你一些其他东西(只要它不违反标准)。

答案 1 :(得分:2)

您的代码将生成Undefined Behavior。未定义的行为是指行为不可预测的计算机代码。代码的输出取决于编译器,环境。

答案 2 :(得分:2)

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf是C编程语言的国际标准

Page No : 126

Heading : Semantics

Item No : 10

从那里引用

  

如果未初始化具有自动存储持续时间的对象   显然,它的价值是不确定的。

这必须回答你的问题。

编辑: @Jens Gustedt在评论中建议

  

6.3.2.1,p2,表示如果左值指定了一个可以用登记册声明的自动存储持续时间的对象   存储类(从未使用过它的地址),那个对象是   未初始化(未使用初始化程序声明且未分配给   它已在使用前执行),行为未定义。

答案 3 :(得分:1)

在初始化之前使用变量时,它将从内存中获取垃圾值 垃圾值是最后存储在为该变量保留的内存位置的值(在本例中为i)。

编译程序时,每次从该内存位置获取该先前存储的值并导致未定义的行为。
没有必要每次都给出输出9。使用不同的编译器编译时,程序的行为可能会有所不同。