#include<stdio.h>
void main(){
int x,y,z;
x=y=z=1;
z=++x||++y&&++z;
printf("%d %d %d \n",x,y,z);
getch();
}
輸出結果爲2 1 1!我無法得到原因......如果按照操作員的優先順序進行操作,則無法解釋。請幫忙解釋c程序的輸出
#include<stdio.h>
void main(){
int x,y,z;
x=y=z=1;
z=++x||++y&&++z;
printf("%d %d %d \n",x,y,z);
getch();
}
輸出結果爲2 1 1!我無法得到原因......如果按照操作員的優先順序進行操作,則無法解釋。請幫忙解釋c程序的輸出
邏輯or
(||
)引入了序列點。評估其左側。然後,當且僅當產生0/false時,評估右側。
在這種情況下,++x
出來2,所以右側永遠不會被評估。這又意味着y
和z
保持爲1
。
||
運營商短路。首先評估左側操作數,如果評估結果爲非零,則不計算右側操作數。這也可以防止評估右操作數的副作用。
當您使用||如果LHS結果爲真,最終結果是真實的。所以,它確實是++ x,結果是1,最終結果是++ x = 2和z = 1 & y = 1
布爾||
短路。一旦它發現它停止評估的真實價值。因此,所有發生在z賦值x中的值增加並且z被設置爲1然後
那麼,它肯定是按順序發生的:'x'遞增,然後'z'設置爲'1'。 –
有趣,但程序的輸出是'2 1 1' – Hogan
oops,'z'設置爲'||'的結果,布爾值,而不是'++ x',所以是的,它是'1 '。但'z'確實在'x'之後分配。 –
補遺上述答案:
在C/C++,這些運算符是短路運營商即, '& &', '||'和'?'(條件運算符)。
幫你一個忙,看看這個excellent wiki page on Short-circuit evaluation。 請不要錯過本文的Common usage部分。
我同意這個清晰和簡單的解釋。 – ChinoCarloSedilla
確定了....謝謝! :) – tortuga