[英]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.