为什么这段代码有效?
#include <stdio.h>
#define X 1
#define Y 2
int main(){
int XY = XY;
printf("%d\n", XY);
return 0;
}
它打印一个垃圾值,没有错误。
我想这是UB?
我在mac OS上测试了这段代码,brew gcc 7.1.0。
gcc的其他用户似乎也遇到了类似的结果。
答案 0 :(得分:1)
使用可能已使用register
关键字声明的未初始化(自动)变量的值是未定义的行为(请参阅C标准中的6.3.2.1p2)。
int XY;
可能已使用register
声明(您没有在任何地方使用其地址)并且它仍然在int XY = XY;
的右侧进行了单位化,因此行为未定义。
如果您执行int XY = *&XY;
,行为将不再是未定义的,但XY
将获得不确定的值。