我有一个同名的局部变量和一个全局变量。
int var = 10;
int main() {
int var = var;
printf("%d", var);
return 0;
}
运行程序会给出以下输出:0
为什么?
全局变量与它无关,您可以注释掉那行代码。当编译器在另一个外部作用域中找到与变量同名的局部变量时,将始终使用该局部变量。
因此,表达式int var = var;
中的两个"var"都指代自身:局部变量。将变量初始化为其未初始化的值是没有任何意义的。该值将保持不确定状态,当您在程序中使用该值时,您将调用未定义的行为:任何事情都可能发生。
main()
中的int var = var
实际上并不访问文件范围内的var
。
结果实际上是未定义的行为,因为它试图访问尚未初始化的本地var
的值。所以你得到的任何结果(0,42,重新格式化硬盘)都是有效的。
试着用不同的编译器构建代码,你很可能会得到不同的输出。
出于好奇,我编译、构建和运行了相同的代码(除了添加#include <stdio.h>
),得到的输出是41944322
。我当前机器上的编译器是gcc 4.8.1(mingw)。