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

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

4

4 回答 4

10

C 中未初始化的局部变量的值是不确定的,读取它会引发未定义的行为。

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

于 2013-06-30T16:24:05.600 回答
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,说如果左值指定了一个可以用寄存器存储类声明的自动存储持续时间的对象(从未使用过它的地址),并且该对象未初始化(未使用初始化程序声明并且没有分配给它已在使用前执行),行为未定义。

于 2013-06-30T16:29:07.027 回答
2

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

于 2013-06-30T16:21:32.320 回答
1

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

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

于 2013-06-30T16:22:52.110 回答