[英]Why does “++x || ++y && ++z” calculate “++x” first, even though operator “&&” has higher precedence than “||”
[英]Operator precedence in C for the statement z=++x||++y&&++z
我當時正在研究運算符優先級,但無法理解x
的值如何變成2
, y
和z
的值如何變成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,並且第二個分支未執行。 ++x
是2
,在布爾上下文中,其值為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
,因此語句++x
為true
。 因此,沒有執行進一步的條件++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.