[英]Short circuit evaluation of a statement with ++ operator in C
我在Windows 7上的Code :: Blocks 10.05中執行了以下代碼。
int a=0,b=0,c;
c=a++&&b++;
printf("\na=%d\nb=%d\nc=%d\n\n",a,b,c);
我獲得的輸出如下,
a=1
b=0
c=0
由於短路評估,這非常有意義。
表達式a++
是后遞增, 0
是返回邏輯和( &&
)。 因此,部分b++
不被評估,因為0 && 0
和0 && 1
評估為0
。
但這引起了我的懷疑。 運算符的優先級值清楚地表明++
具有比&&
更高的優先級。 所以我的理解是這樣的, a++
和b ++都被評估,然后&&
只檢查表達式a++
的結果來做出決定。 但這並沒有發生只有這里評估a++
。
這種行為的原因是什么? &&
作為序列點是否與此行為有關? 如果是這樣,為什么我們說&&
優先級低於++
?
您對評估的 優先順序和順序感到困惑。
優先級定義了運算符的分組方式,即
c = a++ && b++;
相當於:
c = ((a++) && (b++));
評估順序定義了如何評估表達式, &&
的短路意味着首先評估a++
,如果它是零,則結束; 如果它不為零,則評估b++
。
另一個例子:
c = (a++) + (b++);
是a++
之前評估b++
? 答案是我們不知道。 大多數運營商沒有定義評估順序。 &&
是為數不多的定義的運營商之一。 (其余的是||
,
和?:
||
這里有兩個概念 - 優先順序和評估順序。 只有在計算表達式(或子表達式)時,優先順序才會產生影響。
通常,評估順序不是按順序排列的。 給定運算符,可以按任何順序評估其操作數。 可以按任何順序計算函數的參數。
從C ++標准:
1.9程序執行
15除非另有說明,否則對單個算子的操作數和個別表達式的子表達式的評估是不確定的。
和
8.3.6默認參數
9每次調用函數時都會計算默認參數。 函數參數的評估順序未指定。
對於邏輯AND運算符&&
,C ++ 11標准說:
5.14邏輯AND運算符
1
&&
運算符從左到右分組。 操作數都在上下文中轉換為bool
類型(第4條)。 其結果是true
,如果兩個操作數都是true
和false
,否則。 與&
不同,&&
保證從左到右的評估:如果第一個操作數為false
則不評估第二個操作數。
為邏輯OR運算符||
指定了類似的異常 。
由於由於&&
運算符導致表達式短路而未對b++
進行求值,因此在這種特殊情況下,運算符的優先順序沒有意義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.