代码之家  ›  专栏  ›  技术社区  ›  Vivin Paliath

为什么这个C代码要编译?

  •  21
  • Vivin Paliath  · 技术社区  · 14 年前
    #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 回复  |  直到 14 年前
        1
  •  30
  •   Brian R. Bondy    14 年前

    我记得在以前的回答中引用过这句话,但我现在找不到。

    C++ 03§3.3.1/1:

    因此,变量c甚至在初始化器部分之前也是可用的。

    编辑: 对不起,你特别问了C;尽管我确信这里面有一条相等的线。詹姆斯·麦克内利斯发现了它:

        2
  •  11
  •   me_and    14 年前

    你的猜测完全正确。 int c c = c 部分(尽管编译器可能会对此进行优化)。您的编译器正在将值作为 0 ,但并不能保证总是这样。

        3
  •  5
  •   Matthew Flaschen    14 年前

    使用未初始化的值是未定义的行为(§C99 J.2“具有自动存储持续时间的对象的值在被存储时使用 nasal demons 至c=0,至 playing Nethack .

        4
  •  2
  •   Donald Miner    14 年前

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

        5
  •  2
  •   Gustavo V    14 年前

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

    编译器,你永远不必推它会发生。