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。
編輯:添加()到代碼中,仍然是相同的行爲。
'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
@jogojapan @jprofitt它不是一個eveluation ordening問題,因爲當我做這樣的事情時結果是一樣的'char c =((foo [i])|(foo [(++ i)]));' – TheVTM
@TheVTM括號不會改變這種情況。你仍然有兩個參數給'|' - 操作符,操作符參數的評估順序(以及函數參數)不是由標準規定的。 – jogojapan