#include <stdio.h>
int main() {
int c = c;
printf("c is %i\n", c);
return 0;
}
我正在定义一个名为c的整数变量,并将其值赋给自己。但是这怎么可能编译通过呢?c还没有被初始化,那么它的值怎么能被赋给自己呢?当我运行程序时,会得到c is 0。
我认为编译器生成的汇编代码正在为c变量分配空间(当编译器遇到语句时)。然后它取出该未初始化空间中的任意垃圾值并将其再次赋给c。这就是在发生什么吗?
#include <stdio.h>
int main() {
int c = c;
printf("c is %i\n", c);
return 0;
}
我正在定义一个名为c的整数变量,并将其值赋给自己。但是这怎么可能编译通过呢?c还没有被初始化,那么它的值怎么能被赋给自己呢?当我运行程序时,会得到c is 0。
我认为编译器生成的汇编代码正在为c变量分配空间(当编译器遇到语句时)。然后它取出该未初始化空间中的任意垃圾值并将其再次赋给c。这就是在发生什么吗?
我记得之前在另一个回答中引用过这段话,但是现在找不到了。
C++03 §3.3.1/1:
名称的声明点是在其完整的声明符(第8条)后立即,在其初始化程序(如果有的话)之前...
因此,变量c在初始化部分之前就可以使用。
编辑:抱歉,你问的是C语言的特定内容;虽然我确信那里也有一个等效的行。James McNellis找到了它:
C99 §6.2.1/7:除了结构体、联合体或枚举标签外,任何标识符“在其声明符完成后立即具有作用域”。声明符后面跟着初始化器。
你猜得很对。 int c
在堆栈上为变量推送空间,然后在 c = c
部分读取并重新写入该变量(尽管编译器可能会优化它)。您的编译器将该值作为 0
推入,但不能保证始终如此。
c已经被初始化!
虽然这只是一行代码,但实际上它先初始化了c,然后将c赋值给它。你很幸运编译器为你将c初始化为零。
c
并不是指针,而是分配在堆栈上的。 - gnudc
对我来说是未初始化的,这可以通过运行此代码时产生不同的非零输出来证明。 - pilcrowC语言规范不保证变量会被初始化为0,0.0或""或''。
这是编译器的一个特性,你不能相信它会发生。
我总是设置我的IDE/编译器来警告这一点。