代码之家  ›  专栏  ›  技术社区  ›  Galaxy

为什么这段代码会打印垃圾值?

  •  -1
  • Galaxy  · 技术社区  · 6 年前

    这个代码片段是从一个在线的C编程测验中获取的。

    https://www.youtube.com/watch?v=5sOZ7l2it2I

    请帮助我理解这个密码。显然它打印了一个垃圾值。这里有一个局部变量var,它隐藏全局变量var的范围。我假定用全局变量var的值初始化局部变量var,全局var的r值被复制到局部变量。代码中的name var现在引用本地var。因此打印本地var也应该打印5。但事实并非如此。程序打印一个垃圾值。这意味着本地VAR未初始化,或者在初始化局部变量时发生了某种错误。这是一个行为不明确的问题吗?

    #include <stdio.h>
    int var = 5;
    int main() {
      int var = var;
      printf("%d", var);
    }
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   Basile Starynkevitch    6 年前

    很抱歉,你的 int var = var; 里面 main 相等的 致:

    int var; // this var is now in the current scope but is uninitialized
    var = var; // assign the garbage value from var to var.
    

    所以全球 var 被忽略,而本地 风险价值 保留其垃圾值(因为它被分配给自己)。

    阅读有关 lexical scoping 是的。检查C11标准 n1570 (尤其是第6.2.1条)。

    顺便说一下,如果你要求所有的警告和调试信息,一个足够好的编译器可能会警告你。 gcc -Wall -Wextra -g 具有 GCC 事实上,它不适用于Debian/Linux上的GCC 8)。

    根据经验,最好为全局变量提供更长的描述性名称,并且始终避免命名为局部变量(块范围) automatic variables 像全局或静态(文件范围)一样。

    关于 undefined behavior ,读 Lattner's blog 而且是 scared 乌兰巴托。