2012-07-02 101 views
1
#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程序的輸出

回答

6

邏輯or||)引入了序列點。評估其左側。然後,當且僅當產生0/false時,評估右側。

在這種情況下,++x出來2,所以右側永遠不會被評估。這又意味着yz保持爲1

+0

我同意這個清晰和簡單的解釋。 – ChinoCarloSedilla

+0

確定了....謝謝! :) – tortuga

3

||運營商短路。首先評估左側操作數,如果評估結果爲非零,則不計算右側操作數。這也可以防止評估右操作數的副作用。

1

當您使用||如果LHS結果爲真,最終結果是真實的。所以,它確實是++ x,結果是1,最終結果是++ x = 2和z = 1 & y = 1

1

布爾||短路。一旦它發現它停止評估的真實價值。因此,所有發生在z賦值x中的值增加並且z被設置爲1然後

+0

那麼,它肯定是按順序發生的:'x'遞增,然後'z'設置爲'1'。 –

+0

有趣,但程序的輸出是'2 1 1' – Hogan

+0

oops,'z'設置爲'||'的結果,布爾值,而不是'++ x',所以是的,它是'1 '。但'z'確實在'x'之後分配。 –