命名空間
變體
動作

C++ 運算子優先權

出自 cppreference.com
< cpp‎ | language
 
 
C++ 語言
一般主題
流程控制
條件執行陳述式
if
疊代陳述式 (迴圈)
for
範圍 for (C++11)
跳躍陳述式
函式
函式宣告
Lambda 函式運算式
inline 指定符
動態例外規範 (直到 C++17*)
noexcept 指定符 (C++11)
例外
命名空間
型別
指定符
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
儲存期指定符
初始化
 
 

下表列出了 C++ 運算子的優先權與結合性。運算子由上至下依優先權遞減排列。abc 為運算元。

優先權 運算子 描述 結合性
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 逗號運算子 由左至右 →
  1. sizeof 的運算元不能是 C 風格的轉型:運算式 sizeof (int) * p 會明確地被解析為 (sizeof(int)) * p,而非 sizeof((int)*p)
  2. 條件運算子中間(位於 ?: 之間)的運算式在解析時會被視為有加上括號:其相對於 ?: 的優先權會被忽略。

在解析運算式時,列於上表中某行的運算子,其優先權會高於任何列在下方且優先權較低的運算子(如同用括號括起來一樣)。例如,運算式 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 ++*pdelete(++(*p))),而一元後置運算子永遠是「由左至右」結合(a[1][2]++((a[1])[2])++)。請注意,儘管成員存取運算子與一元後置運算子歸類在一起,其結合性仍然具有意義:a.b++ 會被解析為 (a.b)++ 而非 a.(b++)

運算子優先權不受 運算子多載 的影響。例如,std::cout << a ? b : c; 會被解析為 (std::cout << a) ? b : c;,因為算術左移運算子的優先權高於條件運算子。

[編輯] 備註

優先權與結合性是編譯時期概念,與執行時期的 求值順序 無關。

標準本身並未指定優先權等級,這些等級是由語法推導而來的。

const_caststatic_castdynamic_castreinterpret_casttypeidsizeof...noexceptalignof 並未包含在內,因為它們永遠不會產生歧義。

部分運算子有 替代拼寫方式(例如 and 對應 &&or 對應 ||not 對應 ! 等)。

在 C 語言中,三元條件運算子的優先權高於賦值運算子。因此,運算式 e = a < d ? a++ : a = d(在 C++ 中被解析為 e = ((a < d) ? (a++) : (a = d)))在 C 語言中會因語法或語義限制而無法編譯。詳情請參閱對應的 C 語言頁面。

[編輯] 參見

常用運算子
賦值 遞增
遞減
算術 邏輯 比較 成員
存取
其他

a = b
a += b
a -= b
a *= b
a /= b
a %= b
a &&= b
a |= b
a ^= b
a <<= b
a >>= b

++a
--a
a++
a--

+a
-a
a + b
a - b
a * b
a / b
a % b
~a
a & b
a | b
a ^ b
a << b
a >> b

!a
a && b
a || b

a == b
a != b
a < b
a > b
a <= b
a >= b
a <=> b

a[...]
*a
&a
a->b
a.b
a->*b
a.*b

函數呼叫

a(...)
逗號

a, b
條件

a ? b : c
特殊運算子

static_cast 將一種類型轉換為另一種相關類型
dynamic_cast 在繼承體系中進行轉換
const_cast 新增或移除 cv 限定符
reinterpret_cast 將類型轉換為不相關的類型
C 風格轉換 透過結合 static_castconst_castreinterpret_cast 將一種類型轉換為另一種類型
new 建立具有動態儲存期的物件
delete 銷毀先前由 new 運算式建立的物件並釋放取得的記憶體區域
sizeof 查詢類型的容量大小
sizeof... 查詢參數包的大小 (自 C++11 起)
typeid 查詢類型的類型資訊
noexcept 檢查運算式是否可能拋出例外 (自 C++11 起)
alignof 查詢類型的對齊要求 (自 C++11 起)

C 文件 中的 C 運算子優先權
English Deutsch 日本語 中文(简体) 中文(繁體)