具有相同名称,意外值的全局变量和局部变量

时间:2015-12-23 06:47:30

标签: c global-variables local-variables

我有一个同名的本地变量和全局变量。

int var = 10;
int main() {
    int var = var;
    printf("%d", var);
    return 0;
}

运行程序会输出:0

为什么?

2 个答案:

答案 0 :(得分:4)

全局变量与它无关,你可以注释掉那行代码。当编译器在另一个外部作用域中找到与变量同名的局部变量时,将始终使用局部变量。

因此," var"在表达式int var = var;中引用自身:局部变量。将变量初始化为其未初始化的值并没有任何意义。该值将保持不确定状态,当您在程序中使用该值时,您将调用未定义的行为:任何事情都可能发生。

答案 1 :(得分:2)

int var = var中的main()实际上并未访问文件范围内的var

结果实际上是未定义的行为,因为它试图访问尚未初始化的本地var的值。因此,您获得的任何结果(零,42,重新格式化您的硬盘驱动器)都是有效的。

尝试使用不同的编译器构建代码,您可以获得不同的输出。

出于好奇,我编译,构建并运行相同的代码(除了添加#include <stdio.h>之外),我收到的输出是41944322。我当前机器上的编译器是gcc 4.8.1(mingw)。