2013-02-05 66 views
0

可能重複:
Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)神祕浮點異常

我的朋友和我都搞亂一輪苦思最差的,我們能想到的循環(所以不要告訴我這是可怕的代碼,因爲它應該是!)。

我的朋友想出了這個for循環:

for (int i = 0; i++ & ++i % (++i % 2) ? --i : i++; i++); 

它看起來確定,但它失敗甚至是第一次進入由於浮點異常。 所以我的第一個念頭是模0.除以但它似乎不是沒有,因爲如果你這樣做,它運行良好:

for (int i = 0; i < 100; i++) { 
    i++ & ++i % (++i % 2); 
} 

但這不會:

for (int i = 0; i < 100; i++) { 
    i++ & ++i % (++i % 2) ? --i : i++; 
} 

但它變得陌生。第一個案例運行良好第二個案例不會:

for (int i = 0; i < 100; i++) { 
    i++ & ++i % (++i % 2) ? 0 : 1; 
} 

for (int i = 0; i < 100; i++) { 
    i++ & ++i % (++i % 2) ? 1 : 0; // 1 and 0 switched 
} 

所以現在我真的很困惑發生了什麼,但它又變得更加怪異。如果你把情況跟? 0 : 1(其中細RAN)到if語句再次拋出浮點異常:

for (int i = 0; i < 100; i++) { 
    if (i++ & ++i % (++i % 2) ? 0 : 1); 
} 

我完全失去了這一點。任何人有任何想法這裏發生了什麼?

+0

我什至不是什麼。 –

+1

http://stackoverflow.com/questions/949433/could-anyone-explain-these-undefined-behaviors-i-i-i-i-i-etc – chris

+0

如果您將&更改爲&&,會發生什麼? – Thalia

回答

3

它出錯了i++ & ++i&運算符不會對其操作數進行排序,因此在兩側添加增量會導致未定義的行爲。順便說一下,它可能是除零除外,但不一定來自FPU。

1

一般來說,在C和C++的單個表達式中混合使用這樣的多個增量操作是一個壞主意,因爲它通常會導致未定義的行爲。有了未定義的行爲,神祕地改變行爲並不令人驚訝。

另一方面,Java爲所有算術和邏輯運算(非fpstrict表達式中的浮點指數精度除外)提供了嚴格的規範。您可以將所有這些內容放入Java中(忽略int不再是有效的布爾表達式),並讓它們給出一致的答案,儘管它可能不是您所期望的。