C++ 運算子優先順序
下表列出了 C++ 運算子的優先順序和結合性。運算子從上到下按優先順序降序排列。a、b 和 c 是運算元。
優先順序 | 運算子 | 描述 | 結合性 |
---|---|---|---|
1 | a::b | 作用域解析 | 從左到右 → |
2 | a++ a-- | 字尾/後置 增量和減量 | |
type (a) type {a} |
函式式轉換 | ||
a() | 函式呼叫 | ||
a[] | 下標 | ||
a.b a->b | 成員訪問 | ||
3 | ++a --a | 字首 增量和減量 | 從右到左 ← |
+a -a | 一元 加號和減號 | ||
!a ~a | 邏輯非 和 按位非 | ||
(type )a
|
C 風格轉換 | ||
*a | 間接定址 (解引用) | ||
&a | 取地址 | ||
sizeof
|
sizeof[注 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 | 按位與 | |
12 | a ^ b | 按位異或 (異或) | |
13 | a | b | 按位或 (包含或) | |
14 | a && b | 邏輯與 | |
15 | a || b | 邏輯或 | |
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 | 透過按位與、異或和或進行的複合賦值 | ||
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 的語法或語義限制而編譯失敗。詳情請參見相應的 C 頁面。
[編輯] 另請參見
常見運算子 | ||||||
---|---|---|---|---|---|---|
賦值 | 遞增 遞減 |
算術 | 邏輯 | 比較 | 成員 訪問 |
其他 |
a = b |
++a |
+a |
!a |
a == b |
a[...] |
函式呼叫 a(...) |
逗號 a, b | ||||||
條件 a ? b : c | ||||||
特殊運算子 | ||||||
static_cast 將一種型別轉換為另一種相關型別 |
C 文件 關於 C 運算子優先順序
|