共用方式為


優先順序和評估的順序

優先順序和順序關聯性的 c 運算子會影響群組和評估的運算式中的運算元。 運算子優先順序是具有高或較低優先順序的其他運算子都存在時,才有意義的。 與較高優先順序的運算子的運算式會先行計算。 Word 「 繫結。 」 也可以描述優先順序 具有較高優先順序的運算子是指具有更緊密的繫結。

下表摘要的優先順序和順序關聯性 (運算元都計算的順序) 的列出順序從最高額排到最低的 c 運算子。 在數個運算子一起出現,它們具有相同的優先順序,並會根據其順序關聯性來評估。 在資料表中的運算子開頭各節將說明後置運算子。 本節的其餘部分中提供優先順序和關聯性的一般資訊。

優先順序和順序關聯性的 c 運算子

Symbol1

操作類型

順序關聯性

[ ] ( ) . ->後置++及後置 -

運算式

由左至右

前置詞++和前置詞 -sizeof & * + – ~! 

一元

由右至左

typecasts

一元

由右至左

* / %

乘法類 (Multiplicative)

由左至右

+ –

加法類 (Additive)

由左至右

<< >>

位元移位

由左至右

< > <> = =

關聯式

由左至右

== !=

相等

由左至右

&

位元-和

由左至右

^

位元互斥 OR

由左至右

|

位元 (含)-OR

由左至右

&&

邏輯層,

由左至右

||

邏輯 OR

由左至右

? :

條件式運算式

由右至左

= *= /= %= 

+ = – = <> = = & =

^= |=

簡單及複合的 assignment2

由右至左

,

循序的評估

由左至右

1. 運算子的優先順序,依遞減順序所示。 如果數個運算子出現在同一行,或在群組中,它們具有相同的優先順序。

2. 所有的簡單及複合指派運算子具有相同的優先順序。

運算式可以包含數個運算子具有相同的優先順序。 當數個這類運算子出現在運算式中相同層級時,評估進行是依照的接線通話,由右至左或從左到右順序關聯性。 評估的方向不會影響包含一個以上的乘法運算式的結果 (*),加法 (+),或二進位位元 (和 |^) 在相同的層級的運算子。 所用的語言未定義的作業順序。 如果編譯器可以保證一致的結果,編譯器就可用來評估這類的運算式,以任何順序。

只循序評估 ()、 邏輯層和 (& &)、 邏輯 OR (||)、 條件式運算式 (? :),和函式呼叫運算子組成的序列點,並因此保證其運算元的評估的特定的順序。 函式呼叫運算子是之後的函式的識別項的括號組。 循序評估運算子 () 保證在評估運算元從左到右。 (請注意逗號運算子函式呼叫中的不與循序評估運算子相同,且不提供任何這類的保證)。 如需詳細資訊,請參閱序列點

邏輯運算子也會保證由左至右評估其運算元的右邊。 不過,它們會評估運算元判斷運算式的結果所需的最小的數字。 這稱為對 「 短路 」 評估。 因此,它不會評估某些運算式的運算元。 比方說,在運算式中

x && y++

第二個運算元, y++,才會評估x則為 true (非零)。 因此, y就不會遞增,如果x為 false (0)。

範例

下列清單顯示方式,編譯器會自動連線數個範例運算式:

運算式

自動繫結

a & b || c

(a & b) || c

a = b || c

a = (b || c)

q && r || s--

(q && r) || s––

在第一個運算式中,位元-和運算子 (&) 優先順序高於邏輯 OR 運算子 (||),因此a & b形成邏輯 OR 運算的第一個運算元。

在第二個運算式中,邏輯 OR 運算子 (||) 優先順序高於簡單指派運算子 (=),因此b || c分組為工作分派中右方的運算元。 請注意,將值指派給a是 0 或 1。

第三個運算式會顯示的格式正確的運算式,可能會產生無法預料的結果。 邏輯層和運算子 (&&) 優先順序高於邏輯 OR 運算子 (||),因此q && r群組做為運算元。 因為邏輯運算子保證從左到右和評估運算元的q && r先驗算s––。 不過,如果q && r評估結果為非零的值, s––則不評估,以及s不會減少。 如果不遞減s會造成問題,在程式中, s––應該顯示為第一個運算元的運算式,或s應該會減少在不同的作業。

下列的運算式是不合法的並產生編譯時期的診斷訊息:

不合法的運算式

預設群組

p == 0 ? p += 1: p += 2

( p == 0 ? p += 1 : p ) += 2

在此運算式中,等號比較運算子 (==) 優先順序最高,所以p == 0種資料分為作為運算元。 條件運算運算子 (? :) 的下一步] 最高的優先順序。 第一個運算元是p == 0,而第二個運算元是p += 1。 不過,最後一個運算子的運算元之條件式運算式會被視為p而不是p += 2之後的此次, p繫結更接近條件運算運算子比起複合設定運算子。 因為,就會發生語法錯誤+= 2沒有左方的運算元。 您應該使用括弧來防止這種類型的錯誤,並產生一目瞭然的程式碼。 例如,您可以使用括號,如下所示來更正並釐清上述的範例:

( p == 0 ) ? ( p += 1 ) : ( p += 2 )

請參閱

參考

C 運算子