優先順序和評估的順序
優先順序和順序關聯性的 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 )