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

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

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

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

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

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

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,表示如果左值指定了一个自动存储持续时间的对象,该对象可能已经使用寄存器存储类声明(从未使用过其地址),并且该对象未初始化(未使用初始化程序声明且未分配给它已在使用前执行),行为未定义。

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

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