C++ 運算子優先權
下表列出了 C++ 運算子的優先權與結合性。運算子由上至下依優先權遞減排列。a、b 與 c 為運算元。
| 優先權 | 運算子 | 描述 | 結合性 |
|---|---|---|---|
| 1 | a::b | 範圍解析 | 由左至右 → |
| 2 | a++ a-- | 後置/後綴 遞增與遞減 | |
type(a) type{a} |
函數式轉型 (Functional cast) | ||
| a() | 函數呼叫 | ||
| a[] | 下標 (Subscript) | ||
| a.b a->b | 成員存取 | ||
| 3 | ++a --a | 前置 遞增與遞減 | 由右至左 ← |
| +a -a | 一元 正號與負號 | ||
| !a ~a | 邏輯非 與 位元非 | ||
(type)a
|
C 風格轉型 | ||
| *a | 間接運算子 (解參考) | ||
| &a | 取址運算子 | ||
sizeof
|
Size-of[註 1] | ||
| co_await | await 運算式 (C++20) | ||
new – new[] |
動態記憶體配置 | ||
delete – delete[] |
動態記憶體釋放 | ||
| 4 | a.*b a->*b | 指向成員運算子 | 由左至右 → |
| 5 | a * b a / b a % b | 乘法、除法與餘數 | |
| 6 | a + b a - b | 加法與減法 | |
| 7 | a << b a >> b | 位元 左移與右移 | |
| 8 | a <=> b | 三向比較運算子 (C++20 起) | |
| 9 | a < b a <= b a > b a >= b | 分別用於 關係運算子 <、<=、> 與 >= | |
| 10 | a == b a != b | 分別用於 相等運算子 == 與 != | |
| 11 | a & b | 位元 AND | |
| 12 | a ^ b | 位元互斥或 (XOR) | |
| 13 | a | b | 位元或 (OR) (含括或) | |
| 14 | a && b | 邏輯 AND | |
| 15 | a || b | 邏輯 OR | |
| 16 | a ? b : c | 三元條件運算子[註 2] | 由右至左 ← |
throw
|
throw 運算子 | ||
| co_yield | yield 運算式 (C++20) | ||
| a = b | 直接賦值 (C++ 類別預設提供) | ||
| a += b a -= b | 加法與減法複合賦值 | ||
| a *= b a /= b a %= b | 乘法、除法與餘數複合賦值 | ||
| a <<= b a >>= b | 位元左移與右移複合賦值 | ||
| a &= b a ^= b a |= b | 位元 AND、XOR 與 OR 複合賦值 | ||
| 17 | a, b | 逗號運算子 | 由左至右 → |
- ↑ sizeof 的運算元不能是 C 風格的轉型:運算式 sizeof (int) * p 會明確地被解析為 (sizeof(int)) * p,而非 sizeof((int)*p)。
- ↑ 條件運算子中間(位於
?與:之間)的運算式在解析時會被視為有加上括號:其相對於?:的優先權會被忽略。
在解析運算式時,列於上表中某行的運算子,其優先權會高於任何列在下方且優先權較低的運算子(如同用括號括起來一樣)。例如,運算式 std::cout << a & b 與 *p++ 會被解析為 (std::cout << a) & b 與 *(p++),而非 std::cout << (a & b) 或 (*p)++。
具有相同優先權的運算子會依據其結合性方向與其參數結合。例如,因為賦值運算子具有「由右至左」的結合性,運算式 a = b = c 會被解析為 a = (b = c),而非 (a = b) = c;但因為加法與減法具有「由左至右」的結合性,a + b - c 會被解析為 (a + b) - c,而非 a + (b - c)。
結合性的規格說明對一元運算子來說是多餘的,僅為完整性而顯示:一元前置運算子永遠是「由右至左」結合(delete ++*p 是 delete(++(*p))),而一元後置運算子永遠是「由左至右」結合(a[1][2]++ 是 ((a[1])[2])++)。請注意,儘管成員存取運算子與一元後置運算子歸類在一起,其結合性仍然具有意義:a.b++ 會被解析為 (a.b)++ 而非 a.(b++)。
運算子優先權不受 運算子多載 的影響。例如,std::cout << a ? b : c; 會被解析為 (std::cout << a) ? b : c;,因為算術左移運算子的優先權高於條件運算子。
[編輯] 備註
優先權與結合性是編譯時期概念,與執行時期的 求值順序 無關。
標準本身並未指定優先權等級,這些等級是由語法推導而來的。
const_cast、static_cast、dynamic_cast、reinterpret_cast、typeid、sizeof...、noexcept 與 alignof 並未包含在內,因為它們永遠不會產生歧義。
部分運算子有 替代拼寫方式(例如 and 對應 &&,or 對應 ||,not 對應 ! 等)。
在 C 語言中,三元條件運算子的優先權高於賦值運算子。因此,運算式 e = a < d ? a++ : a = d(在 C++ 中被解析為 e = ((a < d) ? (a++) : (a = d)))在 C 語言中會因語法或語義限制而無法編譯。詳情請參閱對應的 C 語言頁面。
[編輯] 參見
| 常用運算子 | ||||||
|---|---|---|---|---|---|---|
| 賦值 | 遞增 遞減 |
算術 | 邏輯 | 比較 | 成員 存取 |
其他 |
|
a = b |
++a |
+a |
!a |
a == b |
a[...] |
函數呼叫 a(...) |
| 逗號 a, b | ||||||
| 條件 a ? b : c | ||||||
| 特殊運算子 | ||||||
|
static_cast 將一種類型轉換為另一種相關類型 | ||||||
| C 文件 中的 C 運算子優先權
|