2013-06-19 80 views
0

在我的代碼中發現了一個奇怪的行爲。Visual Studio預增值錯誤

代碼:

char foo[] = {64, 1}; 
int i = 0; 

char c = ((foo[i]) | (foo[(++i)])); 

cout << "Text: " << c << " " << (int)c << endl; 

結果:

Text: ☺ 1 

我specting 「文字:A 1」,而不是 「文字:☺1」。出於某種原因,編譯器忽略了「| foo [++ i]」部分。

那麼這個解決方案很簡單,它只需要另一行,但我感興趣的是是知道這是一個編譯器錯誤還是隻是C++怪異

測試VC10和VC11。

編輯:添加()到代碼中,仍然是相同的行爲。

+2

'foo [i] |中的評估順序foo [++ i]'沒有被指定。關於類似問題有很多問題,例如[未定義的行爲和順序點](http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points)。在你的特定情況下,我猜'i'是第一次遞增的('++ i'),然後你得到'c = foo [1] | foo [1]',這是'c = 1 | 1',即'c = 1'。請注意,依賴於無序操作不僅會使結果難以預測,而且會導致未定義的行爲。 – jogojapan

+0

@jogojapan @jprofitt它不是一個eveluation ordening問題,因爲當我做這樣的事情時結果是一樣的'char c =((foo [i])|(foo [(++ i)]));' – TheVTM

+2

@TheVTM括號不會改變這種情況。你仍然有兩個參數給'|' - 操作符,操作符參數的評估順序(以及函數參數)不是由標準規定的。 – jogojapan

回答

0

表達式的順序(格式不正確的公式)未在C++標準中記錄。它取決於編譯器的行爲。例如:

push(pop() * pop()); 

C++沒有記錄調用pop()的順序。所以MSVC和GCC的結果是不同的。您應該分步撥打foo[i]foo[++i]