C:同名的全局变量和局部变量

ama*_*eka 2 c gcc

码:

#include <stdio.h>

int var = 20;
int main()
{
   int var = var;
   printf("%d\n", var);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

GCC在此代码中输出垃圾值.我的疑问是,这应该输出"20".

说明:每当我们为任何全局/局部变量赋值时,第一条指令是计算机将指定的值保存到寄存器中,然后将其放入内存中.所以,据我所知,当编译器来到"int var = var"时,它应该首先将值20保存到特定寄存器.之后它会将它保存到局部变量.然后全局变量应该超出范围.是的,它与首先分配变量名称而不是其值的陈述相矛盾.因此,int var使全局var变量超出范围并使局部变量自己赋值,这相当于未初始化的局部变量.

Sne*_*tel 7

在C和C++中,变量的范围在声明后立即开始.因此,当读取值var以便将其分配时var,本地var已经在范围内.

讨论寄存器和记忆以及其他一些问题; C是一种标准化语言,其行为取决于标准.


R S*_*ahu 6

int var = var;
Run Code Online (Sandbox Code Playgroud)

是未定义的行为.它是具有未初始化值的自我赋值.

  • @Amanp:您的解释描述了语言设计者可以定义该代码行为的方式.问题是,他们没有这样做.语言设计师可以设计他们的语言. (2认同)