2017-10-13 133 views
-2
#include <stdio.h> 

int main(){ 
    int a=5,b=-7,c=0,d; 
    d=++a && ++b || ++c; 
    printf("%d %d %d %d",a,b,c,d); 
} 

這裏c的值應該增加到1,但它是給0,爲什麼?爲什麼預增量沒有評估

+1

[(布爾)短路評估](https://en.wikipedia.org/wiki/Short-circuit_evaluation)再次觸發。 – alk

+0

我只能猜測這是因爲'||'操作符不能執行,因爲第一部分'&&'已經是'true',因此'||' ++ c'無所謂。 –

+0

@AnteJablanAdamović爲什麼猜測? –

回答

2

因爲||如果左手評估爲真,則不評估右手側。在你的例子中,

++a && ++b 

評估爲非零,將其視爲true。因此,根據懶惰評估規則,++c完全被忽略。

4

這是因爲短路。如果您有a && b,則只有在a爲真時纔會評估b。同樣,如果您有a || b,則僅在a爲假時纔會評估b

在你的情況下,++a && ++b || ++c組爲(++a && ++b) || ++c。首先對++a進行評估,這是真的,所以++b被評估,並且也是如此。此時,評估將停止,因爲現在確定||運算符的結果爲真,因此不會評估++c