[英]Why does “++x || ++y && ++z” calculate “++x” first, even though operator “&&” has higher precedence than “||”
[英]++ has higher precedence than logical operator?
如果是這樣,那么下面程序的輸出是什么。
#include<stdio.h>
int main()
{
int i=-3, j=2, k=0, m;
m = ++i || ++j && ++k;
printf("%d, %d, %d, %d\n", i, j, k, m);
return 0;
}
在gcc下的輸出是** -2 2 0 1 **但是如何?
++i
值是-2
,不為零,因此在布爾上下文中為“ true”,並且其中的短條件條件停止符和j
和k
保持其原始值。 布爾值“ true”轉換為值1
的整數,該整數被分配給m
。
優先級確定操作數和運算符的分組; 它不能確定評估順序。 ||
&&
強制從左至右進行評估; 首先評估++i
。 如果結果不為0(例如在這種情況下),則根本不評估++j && ++k
。
這是因為邏輯運算符會進行短路評估。
一旦知道結果,就不再進行評估。
在您的情況下,由於++i
評估為true
並后跟一個or,因此甚至不再評估任何子表達式。
“優先級”發生的事情是這樣的:計算||
的結果 (最低的“優先級”)編譯器需要首先計算左側的結果。 在您的情況下,結果為true
因此不需要整個計算,因為整個表達式的結果是已知的。
如果需要評估右側,則將在||
之前評估++
。 。
其他人已經解釋了為什么'||'之后的部分 不評估。 但是,我想強調標准的一個非常重要的部分,它會導致這種行為。 “ ||” 邏輯運算符充當序列點 ,這需要從左到右的求值順序,而與同一表達式中的其他運算符無關。
引用標准ISO / IEC 9899 (6.5.13 / 14,第88頁)
不像按位| 運算符,|| 運營商保證從左到右的評估; 在第一個操作數求值之后有一個序列點。 如果第一個操作數比較不等於0,則不計算第二個操作數。
換句話說,表達式“ a + b * c”與“ a || b && c”不同,因為前者被視為一個不帶序列點的表達式,而后者是一個具有序列點的表達式。 顧名思義,順序點強制評估的順序。 一旦評估了完整表達的結果(例如,當||的LHS評估為“ 1”時),就可以停止對表達的進一步評估。 因此,您看到的順序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.