簡體   English   中英

++的優先級高於邏輯運算符?

[英]++ 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”,並且其中的短條件條件停止符和jk保持其原始值。 布爾值“ 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.

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