2013-02-02 15 views
-3

考慮下面的代碼:循環中的未初始化局部變量在每次迭代中的值是否相同?

int l; 
int k; 
for (int i=0; i < 2; ++i) 
{ 
    int j; 
    if (i == 0) l = j; 
    if (i == 1) k = j; 
} 
assert (l == k); 

是否斷言持有?有趣的是如果未初始化的變量可以在不同的迭代中採用不同的值。

有些玩LLVM的人認爲斷言實際上確實存在:這實際上是由標準保證還是未定義,並且它發生在LLVM編譯器實現它的方式?

+1

請不要通過要求定義未定義的行爲來打擾社區,謝謝。 – 2013-02-02 23:49:19

+1

編譯器錯誤,未定義j和斷言(j == k) – qPCR4vir

+0

@ H2CO3:沒有未定義的行爲。 – ipc

回答

3

至於你在試圖要做的事:j的值是不確定的。它只是在聲明時發生的任何事情,所以斷言確實不是。


編輯:有人指出,由於j每次所分配的時間很可能在棧上的同一個地方,有什麼價值的預期行爲?

事實是相同的只是實施的事實。該標準規定:

6.2.4對於這樣一個對象,該對象不具有可變長度數組類型,它的壽命從進入與 它所關聯直到該塊的執行在結束塊延伸任何方式。 (輸入封閉塊或調用函數會暫停,但 不會結束,執行當前塊。)如果塊以遞歸方式輸入 ,則每次都會創建該對象的新實例。 對象的初始值是 不確定。如果爲該對象指定了初始化爲 ,則每執行一次該塊的聲明達到 時執行該初始化;否則,每次達到聲明時,該值都變爲 不確定。

這是不確定的。

編輯2:這是C標準。從C++:

6.7變量與自動存儲持續時間(3.7.2)每個 一次執行其聲明陳述被初始化。變量 在塊中聲明的自動存儲持續時間在從塊(6.6)退出 時被銷燬。

+0

如果它真的是「聲明時發生在堆棧上的任何事情」,爲什麼這個值會在迭代之間改變? –

+0

謝謝,大衛,這實際上是我問的。 LLVM將j放在入口塊的堆棧中,並保持在那裏,所以在給定IR的情況下,它不會改變,我只是想知道這是否有保證。 –

+0

不,你不是這樣問的。你在問什麼保證標準提供。這個答案似乎假設'j'存儲在堆棧中。標準對此沒有提及。 –