为什么此代码打印出垃圾值?

时间:2018-06-23 18:56:13

标签: c scope initialization

此代码段摘自在线C编程测验。

  

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

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

#include <stdio.h>
int var = 5;
int main() {
  int var = var;
  printf("%d", var);
}

1 个答案:

答案 0 :(得分:3)

从总体上讲,您在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被忽略,而局部var保留其垃圾值(因为它已分配给自己)。

了解有关lexical scoping的信息。检查C11标准n1570(尤其是其§6.2.1)。

顺便说一句,如果您要求所有警告和调试信息(那么gcc -Wall -Wextra -gGCC的话,一个足够好的编译器可能会警告您;实际上,它不适用于Debian / Linux上的gcc 8 ... )。

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

关于undefined behavior,请阅读Lattner's blog并成为UB的scared