【问题标题】:Global and local variable with the same name, unexpected value全局变量和局部变量同名,意外值
【发布时间】:2015-12-23 06:47:30
【问题描述】:

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

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

运行程序给出以下输出:0

这是为什么呢?

【问题讨论】:

  • 本地定义覆盖外部。它在本地范围内。编译器怎么知道哪个是哪个?
  • 我想知道您是怎么错过的:“警告:变量 'var' 在其自己的初始化中使用时未初始化”
  • 以及警告:声明会在全局范围内隐藏变量

标签: c global-variables local-variables


【解决方案1】:

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

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

【讨论】:

  • 从技术上讲,编译器在 same 范围内找到了var。初始化程序本身已经调用了未定义的行为,并且在 printf 语句中再次调用。
【解决方案2】:

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

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

尝试使用不同的编译器构建您的代码,您很可能会得到不同的输出。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多