为什么这不会给出编译错误?

Why doesn't this give compilation error?

本文关键字:编译 错误 为什么      更新时间:2023-10-16
int a = a ;  

根据赋值运算符的规则,它应该从右到左读取该行。 看到"a"后,未声明的编译器应该给出编译错误。
但是it is giving garbage value.请澄清一下。

§3.3.2/1:

名称的声明点紧接在其完整声明符(第 8 条(之后和初始值设定项(如果有(之前,除非下文另有说明。[ 示例:

int x = 12;
{ int x = x; }

这里第二个 x 用它自己的(不确定的(值初始化。

实际上,编译器可能会给你一个提示。我的说:"警告 C4700:未经初始化使用的局部变量'a'"。

但这本身并不是一个错误,声明只是为内存的某些位提供一个变量名称,而不接触它,这是有效且快速的。这里的同名并不是真正的同名,只是从右向左移动位。不再检查。非常有成效,非常不安全。

每个操作都是合法的,但整个事情毫无意义。因此,编译器尽其所能 - 它编译代码,但也发出警告。