2017-07-14 55 views
-6

此代碼爲什麼有效?X,Y,XY爲什麼這個工作在gcc中?

#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的其他用戶正在經歷類似的結果。

+6

該定義是無關緊要的。你有效地詢問'int x = x;'。 – PSkocik

+5

是的,它是UB。 'XY'只是一個從自身初始化的變量。宏與它無關。 –

+2

問題是什麼?你初始化一個未初始化的變量。是的,它是未定義的。與宏無關。 –

回答

1

未定義的行爲使用可能已用register關鍵字聲明的未初始化(自動)變量的值(請參閱C標準中的6.3.2.1p2)。

int XY;本來可以用register來聲明(你不在任何地址),它仍然在int XY = XY;的右邊單元化,所以行爲是不確定的。

如果您確實int XY = *&XY;行爲將不再是未定義的,但XY會得到一個不確定的值。

+0

爲什麼'註冊'在這裏是相關的? –

+0

@EugeneSh。 http://port70.net/~nsz/c/c11/n1570.html#6.3.2.1p2 – PSkocik

+1

即使有一些代碼需要一個指針,它仍然是一個不確定值的初始化...所以仍然不可能告訴任何關於結果的信息(除非它沒有像格式化硬盤那樣做一些完全不同的事情) –