簡體   English   中英

||的評估順序 和&&在c

[英]order of evaluation of || and && in c

如果&&的優先級大於||的優先級,則此代碼不應首先評估--b && ++ c,因此輸出應為1 2 411。但是在這里似乎短路了,得到1 2 5 10.請幫助!

int x;
int a=1,b=5,c=10;
x=a++||--b&&++c;
printf("%d %d %d %d\n",x,a,b,c);
return 0;

此代碼不應該首先評估--b && ++ c

沒有運算符優先級不會影響評估順序。 就是說

a++||--b&&++c

等價於

a++||(--b&&++c)

因此仍然是首先被評估a++ ,從而使語句短路。

&&的優先級更高,這意味着它與||綁定比與||更為緊密。 所以那個表達式等於

a++ || (--b && ++c)

|| 僅當左側的表達式的計算結果為非0時,才對右側的事物進行計算。 由於a為1 ,因此僅對a++求值,並且b不會遞減, c不會遞增。

是的, &&具有更高的優先級,但這僅確定操作數的分組 ,而不是求值順序 這里的基本操作是|| ,這保證了如果左側為true則不會評估其右側,無論右側進行了什么操作。

這里有兩個概念在起作用

  1. 操作員關聯
  2. 編譯器優化 短路

在C中,|| 運算符保持關聯。 結果,將首先評估a ++。 由於左側為TRUE, 編譯器優化 短路將確保||的右側 不求值,因為它不會更改表達式的結果。

懶惰的評價

--b && ++c完全不評估。

暫無
暫無

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

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