#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,爲什麼?爲什麼預增量沒有評估
#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,爲什麼?爲什麼預增量沒有評估
因爲||如果左手評估爲真,則不評估右手側。在你的例子中,
++a && ++b
評估爲非零,將其視爲true。因此,根據懶惰評估規則,++c
完全被忽略。
這是因爲短路。如果您有a && b
,則只有在a
爲真時纔會評估b
。同樣,如果您有a || b
,則僅在a
爲假時纔會評估b
。
在你的情況下,++a && ++b || ++c
組爲(++a && ++b) || ++c
。首先對++a
進行評估,這是真的,所以++b
被評估,並且也是如此。此時,評估將停止,因爲現在確定||
運算符的結果爲真,因此不會評估++c
。
[(布爾)短路評估](https://en.wikipedia.org/wiki/Short-circuit_evaluation)再次觸發。 – alk
我只能猜測這是因爲'||'操作符不能執行,因爲第一部分'&&'已經是'true',因此'||' ++ c'無所謂。 –
@AnteJablanAdamović爲什麼猜測? –