2012-05-03 68 views
3

這個C程序的輸出應該是什麼?以下C程序的輸出

#include<stdio.h> 
int main(){ 
    int x,y,z; 
    x=y=z=1; 
    z = ++x || ++y && ++z; 
    printf("x=%d y=%d z=%d\n",x,y,z); 
    return 0; 
} 

給定輸出是: X = 2 Y = 1個,Z = 1
我明白x的輸出,但看不到ž如何y和值沒有得到增加。

回答

12

這是short-circuit evaluation的結果。

表達++x計算結果爲2,以及編譯器知道2 || anything始終計算爲1(「真」),不管是什麼anything是。因此,它不會繼續評估anything,並且yz的值不會更改。

如果用

x=-1; 
y=z=1; 

嘗試你會看到yz遞增,因爲編譯器必須評估OR的右手邊,以確定表達式的結果。

編輯: asaerl首先在評論中回答您的後續問題,所以我會稍微擴展他的正確答案。

運算符優先級決定組成表達式的各部分如何結合在一起。由於與具有小於或更高的優先級,編譯器知道你寫

++x || (++y && ++z) 

代替

(++x || ++y) && ++z 

這使得其任務是做一個或++x++y && ++z之間。在這一點上,通常可以自由選擇是否會首選評估一個或另一個表達式 - 按照標​​準 - 您通常無法依賴特定順序。該順序與運營商優先級無關。

然而,專爲||&&標準要求該評估將總是從左到右前進,使短路可以工作和開發人員可以上不被評估的RHS表達取決於如果評估的結果lhs告訴。

+1

感謝幫助,但不是優先順序在這裏發揮作用?含義++ y && ++ z應首先在||之前進行評估? – krishnang

+4

編號優先級是解析順序,而不是評估順序。 順便說一句,如果'++ z'被評估過,那就是UB。 (改變'z'兩次) – asaelr

1

在C中,除0以外的任何東西都被視爲true,並且對於||的評估。從左到右。

因此,編譯器將檢查第一個左操作數,如果它是真的,那麼編譯器將不檢查其他操作數。 ex。 A || B - 在這種情況下,如果A爲真,那麼編譯器將只返回真,並且不會檢查B是真還是假。但是,如果A爲假,那麼它將檢查B並相應地返回,如果B爲真則返回true,或者如果B爲假,那麼它將返回假。

在你的程序中,編譯器首先會檢查++ x(即2),而C中除0以外的任何內容都是真的,因此它不會檢查/增加其他表達式。