X,Y,XY为什么这在gcc中有效?

时间:2017-07-14 14:50:18

标签: c

为什么这段代码有效?

#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的其他用户似乎也遇到了类似的结果。

1 个答案:

答案 0 :(得分:1)

使用可能已使用register关键字声明的未初始化(自动)变量的值是未定义的行为(请参阅C标准中的6.3.2.1p2)。

int XY;可能已使用register声明(您没有在任何地方使用其地址)并且它仍然在int XY = XY;的右侧进行了单位化,因此行为未定义。

如果您执行int XY = *&XY;,行为将不再是未定义的,但XY将获得不确定的值。