此代码段摘自在线C编程测验。
请帮助我理解此代码。显然,它打印一个垃圾值。这里我们有一个局部变量var,它隐藏了全局变量var的范围。我假定局部变量var用全局变量var的值初始化,全局变量的rvalue复制到局部var中。我知道从那时起,代码中的名称var现在指的是本地var。因此,打印本地var也应该打印5。但是事实并非如此。该程序打印一个垃圾值。这意味着本地变量未初始化,或者在本地变量初始化期间发生了某种错误。这里发生了什么?这是不确定行为的问题吗?
#include <stdio.h>
int var = 5;
int main() {
int var = var;
printf("%d", var);
}
答案 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 -g
和GCC的话,一个足够好的编译器可能会警告您;实际上,它不适用于Debian / Linux上的gcc 8 ... )。
根据经验,最好为全局变量指定更长的名称和描述性名称,并始终避免像全局或静态(文件范围)那样命名局部(块范围)automatic variables。
关于undefined behavior,请阅读Lattner's blog并成为UB的scared。