#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
。这是怎么回事?
我记得在之前的回答中引用过这一点,但现在找不到。
C++03 §3.3.1/1:
名称的声明点紧接在其完整声明符(第 8 条)之后和其初始值设定项(如果有)之前,...
因此变量 c 即使在初始化部分之前也是可用的。
编辑:抱歉,您专门询问了有关C的问题;虽然我确信那里有一条等效的线。詹姆斯·麦克内利斯找到了它:
C99 §6.2.1/7:任何不是结构、联合或枚举标记的标识符“其范围在其声明符完成后开始”。声明符后面跟着初始化器。
你的猜测完全正确。
int c
将变量的空间推入堆栈,然后从 c = c
部分读取并重写该变量(尽管编译器可能会对其进行优化)。您的编译器将值推为 0
,但不能保证始终如此。
c 已初始化!
虽然这是一行代码,但实际上是先初始化c,然后给c赋值。你很幸运,编译器正在为你将 c 初始化为零。
C 规范不保证变量将被初始化为 0、0.0 或“”或“”。
这是编译器的一个功能,你永远不必强迫它会发生。
我总是将我的 IDE/编译器设置为对此发出警告。