此代碼爲什麼有效?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的其他用戶正在經歷類似的結果。
此代碼爲什麼有效?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的其他用戶正在經歷類似的結果。
未定義的行爲使用可能已用register
關鍵字聲明的未初始化(自動)變量的值(請參閱C標準中的6.3.2.1p2)。
int XY;
本來可以用register
來聲明(你不在任何地址),它仍然在int XY = XY;
的右邊單元化,所以行爲是不確定的。
如果您確實int XY = *&XY;
行爲將不再是未定義的,但XY
會得到一個不確定的值。
爲什麼'註冊'在這裏是相關的? –
@EugeneSh。 http://port70.net/~nsz/c/c11/n1570.html#6.3.2.1p2 – PSkocik
即使有一些代碼需要一個指針,它仍然是一個不確定值的初始化...所以仍然不可能告訴任何關於結果的信息(除非它沒有像格式化硬盤那樣做一些完全不同的事情) –
該定義是無關緊要的。你有效地詢問'int x = x;'。 – PSkocik
是的,它是UB。 'XY'只是一個從自身初始化的變量。宏與它無關。 –
問題是什麼?你初始化一個未初始化的變量。是的,它是未定義的。與宏無關。 –