2017-12-02 82 views
-2

直到今天,我還以爲我明白C++運算符和precedence。我給你以下簡單的代碼:帶布爾值的C++後綴運算符優先級和

int i = 0, j = 0 
i++; 
j++; 

cout << i << ' ' << j << endl; 

當然,我們期待ij的輸出值分別爲1和1。現在如果我們嘗試將增量放入一行,會發生什麼?

int i = 0, j = 0 
i++ && j++; 

cout << i << ' ' << j << endl; 

我在這裏的推理是布爾運算符對輸出沒有影響。但是我們的產出令人驚訝的是i = 1j = 0?那麼這裏發生了什麼?

更加奇怪的是,通過從後綴增量切換到前綴增量或使用另一個布爾運算符,結果如預期。 I.e:

//Expected i=1, j=1 
++i && ++j; 

//Expected i=1, j=1 
i++ || j++; 

P.S.我知道,正確的使用情況來更新這兩個變量在一行是這樣的:

i++, j++; 

但是好奇心得到了最好的我,現在我不知道爲什麼使用布爾AND運營商擁有令人吃驚的結果。

+6

第二個代碼段的輸出不是你聲稱它是:https://ideone.com/61YZL6 –

+0

我認爲他期待&&表達式的左側評估爲0,因爲它應該,因此不需要檢查右側 –

+3

「right用例更新這兩個變量「是'i ++; J ++;'。你把它們放在一個單一的行中就沒有任何好處。 –

回答

1

i++增量i但表達式的結果是0(增量是副作用)。因此表達式i++ && j++從不評估&&運算符的右側。

預增值運算符++i的結果是遞增值。這就是爲什麼++i && ++j也增加j

請注意,沒有一個與優先級有關。最重要的是要準確理解前後增量運算符之間的區別。另一個因素是&&運營商被定義爲「短路」 - 它不能評估表達式的右側如果左側評估爲0.

+0

謝謝邁克爾,我沒有記住,因爲左側評估爲0,我們將永遠不會評估'j'的後增量 – Max