這個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和值沒有得到增加。
這個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和值沒有得到增加。
這是short-circuit evaluation的結果。
表達++x
計算結果爲2
,以及編譯器知道2 || anything
始終計算爲1
(「真」),不管是什麼anything
是。因此,它不會繼續評估anything
,並且y
和z
的值不會更改。
如果用
x=-1;
y=z=1;
嘗試你會看到y
和z
將遞增,因爲編譯器必須評估OR的右手邊,以確定表達式的結果。
編輯: asaerl首先在評論中回答您的後續問題,所以我會稍微擴展他的正確答案。
運算符優先級決定組成表達式的各部分如何結合在一起。由於與具有小於或更高的優先級,編譯器知道你寫
++x || (++y && ++z)
代替
(++x || ++y) && ++z
這使得其任務是做一個或++x
和++y && ++z
之間。在這一點上,通常可以自由選擇是否會首選評估一個或另一個表達式 - 按照標準 - 您通常無法依賴特定順序。該順序與運營商優先級無關。
然而,專爲||
和&&
標準要求該評估將總是從左到右前進,使短路可以工作和開發人員可以上不被評估的RHS表達取決於如果評估的結果lhs告訴。
在C中,除0以外的任何東西都被視爲true,並且對於||的評估。從左到右。
因此,編譯器將檢查第一個左操作數,如果它是真的,那麼編譯器將不檢查其他操作數。 ex。 A || B - 在這種情況下,如果A爲真,那麼編譯器將只返回真,並且不會檢查B是真還是假。但是,如果A爲假,那麼它將檢查B並相應地返回,如果B爲真則返回true,或者如果B爲假,那麼它將返回假。
在你的程序中,編譯器首先會檢查++ x(即2),而C中除0以外的任何內容都是真的,因此它不會檢查/增加其他表達式。
感謝幫助,但不是優先順序在這裏發揮作用?含義++ y && ++ z應首先在||之前進行評估? – krishnang
編號優先級是解析順序,而不是評估順序。 順便說一句,如果'++ z'被評估過,那就是UB。 (改變'z'兩次) – asaelr