簡體   English   中英

C中針對語句z = ++ x || ++ y && ++ z的運算符優先級

[英]Operator precedence in C for the statement z=++x||++y&&++z

我當時正在研究運算符優先級,但無法理解x的值如何變成2yz的值如何變成1

x=y=z=1;

z=++x||++y&&++z;

這評估為

x=2 y=1 z=1

++優先級高於|| ,因此分配的整個RHS歸結為x的增量和對真值(1)的求值。

z = ++x         ||  ++y&&++z;
    truthy (1)     never executed

這是因為++x計算結果為true,並且第二個分支未執行。 ++x2 ,在布爾上下文中,其值為true或1 z取值為1 ,可以觀察到最終狀態。

x=y=z=1
z=++x||++y&&++z

相當於

x=y=z=1
z=((++x)||((++y)&&(++z)));

由於++x返回2 ,該值非零,因此++y && ++z分支不會執行,因此代碼等效於:

x=y=z=1;
z=(++x)||(anything here);

z=++x||++y&&++z;

注意: ++優先級高於||

現在,在執行此行之后, x的值將遞增,並且x=2現在不再執行++y&&++z ,因為第一個條件為true,因此您將得到x=2 y=1 z=1

and &&和the || 操作從左到右執行,此外,在C中0表示false ,任何非零值表示true 你寫

x=y=z=1;
z= ++x || ++y && ++z;

由於x = 1 ,因此語句++xtrue 因此,沒有執行進一步的條件++y && ++z

因此輸出變為:

x=2 // x incremented by 1
y=1 // as it is
z=1 // assigned to true (default true = 1)

現在試試這個

z= ++y && ++z || ++x ;

你會得到

x=1 // as it is because ++y && ++z are both true 
y=2 // y incremented by 1
z=1 // although z incremented by 1 but assigned to true (default true = 1)

最后嘗試一下:

int x = 1;
int y = 0;
int z = 1;

z= y && ++z || ++x;

輸出將是:

因此輸出變為:

x=2 
y=0 
z=0 

因為,現在z的語句如下所示:

z = false (as y =0) && not executed || true
z = false || true
z = true

因此, y保持不變,x遞增並變為2 ,最后z分配為true

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM