int a = a ;
根据赋值运算符的规则,应该从右到左读取该行。 在看到'a'未声明后,编译器应该给出编译错误。
但是,它却给出了垃圾值。请澄清一下。
§3.3.2/1:
名称的声明点是在其完整声明符(第8条款)之后、其初始化程序(如果有)之前。但如下所述除外。【例如:
int x = 12;
{ int x = x; }
这里第二个 x 的值会被初始化为自己的(不确定的)值。— 示例结束]
实际上,编译器可能会给你一些提示。我的说:"警告C4700:局部变量'a'在使用时没有被初始化"。
但是这并不是一个错误,声明只是为某些内存位分配了变量名而没有操作它,这是有效且快速的。这里的赋值也不是真正的赋值,只是将位从右移动到左。没有任何检查,非常高效但也非常不安全。
每个操作都是合法的,但整个过程毫无意义。所以编译器尽其所能——编译代码,但也发出了警告。
a
,然后可能打印出该垃圾值吗?根据您的逻辑,声明中将无法分配任何内容。int a = 1;
将失败,因为赋值“从右到左”进行,因此a
未声明;是吗? - ChiefTwoPencilsa
,因此现在它仍然是最初存在的垃圾值。 - dandan78int x = x;
UB?或int var = 1; void main() { int i = i; }的副本。 - Shafik Yaghmour