簡體   English   中英

和&或運算符在后增量運算符上的工作差異

[英]diffrence in working of post increment operator with and & or operator

這種后遞增運算符的用法令人困惑。

{int a=0,b=1,c=2,d;
d=a++||b++||c++
printf("%d %d %d %d",a,b,c,d);}

輸出是

1,2,2,1

c值沒有增加,但是如果我用&&運算符替換它,它的值會增加。 為什么?

引用C11 ,第§6.5.14章( 重點是我的

不像按位| 運算符, || 運營商保證從左到右的評估; 如果對第二個操作數求值,則在第一個和第二個操作數的求值之間有一個序列點。 如果第一個操作數比較不等於0 ,則不計算第二個操作數。

所以,就您而言,

 d=a++||b++||c++

是相同的

 d= ( (a++ || b++) || c++)      

然后,評估第a++括號內的語句,首先將a++ (后遞增)評估為0(待處理的副作用),因此第一個||的RHS。 被求值b++ ,產生1和||的結果 運算為TRUE,得出1。

結果1是第二個||的LHS。 因此,第二個||的RHS c++ )不再進行求值,最終結果變為TRUE,再次產生1 ,並將其存儲在d

所以,最后,

  • a++被評估為1
  • b++評估為2
  • c++ 評估,仍為2
  • ||的結果 存儲在d ,即為TRUE,因此存儲1。

另一方面,對於邏輯AND &&運算符,

[...]如果第一個操作數比較等於0,則不評估第二個操作數。

因此,如果您替換最后一個|| 使用&& ,然后對於外部語句,LHS變為1,並且RHS進行評估,使c++被評估並增加,這是一個副作用。

暫無
暫無

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

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