为什么这个C代码编译?

时间:2010-07-13 16:45:53

标签: c variable-declaration

#include <stdio.h>
int main() {
    int c = c;
    printf("c is %i\n", c);
    return 0;
}

我正在定义一个名为c的整数变量,我将其值赋给自己。但这怎么可以编译呢? c尚未初始化,那么它的价值如何分配给自己呢?当我运行程序时,我得到c is 0

我假设编译器正在生成为c变量分配空间的汇编代码(当编译器遇到int c语句时)。然后它接受未初始化空间中的任何垃圾值并将其分配回c。这是发生了什么事吗?

5 个答案:

答案 0 :(得分:30)

我记得在之前的回答中引用了这个,但我现在找不到它。

C ++03§3.3.1/ 1:

  

名称的声明点紧跟在其完整的声明者(第8条)之后和其初始化者(如果有的话)之前,......

因此,变量c甚至可以在初始化器部件之前使用。

编辑:抱歉,您特意询问了C;虽然我确信那里有一条等效线。 James McNellis找到了它:

  

C99§6.2.1/ 7:任何非结构,联合或枚举标记的标识符“都具有在其声明符完成后才开始的范围。”声明符之后是初始化器。

答案 1 :(得分:11)

你的猜测是完全正确的。 int c将空间推送到堆栈以获取变量,然后从c = c部分读取并重写(尽管编译器可以优化它)。你的编译器正在推动值为0,但并不总是保证这种情况。

答案 2 :(得分:5)

使用未初始化值的未定义行为(§C99J.2“使用具有自动存储持续时间的对象的值时 不确定“)。所以任何事情都可能发生在nasal demons到c = 0到playing Nethack

答案 3 :(得分:2)

c已初始化!

虽然这是一行代码,但事实上它首先初始化c,然后将c分配给它。你很幸运,编译器正在为你初始化c。

答案 4 :(得分:2)

C规范不保证变量将初始化为0,0.0或“”或“”。

这是编译器的功能,从来没有你必须强调会发生这种情况。

我总是将我的IDE /编译器设置为警告。