命名空間
變體
動作

C 運算子優先順序

出自 cppreference.com
< c‎ | 語言

下表列出了 C 語言運算子的優先順序與結合性。運算子由上至下依優先順序遞減排列。

優先順序 運算子 描述 結合性
1 ++ -- 後置遞增與遞減 由左至右
() 函式呼叫
[] 陣列下標
. 結構與聯合成員存取
-> 透過指標存取結構與聯合成員
(型別){列表} 複合字面量(C99)
2 ++ -- 前置遞增與遞減[註 1] 由右至左
+ - 一元加法與減法
! ~ 邏輯 NOT 與位元 NOT
(型別) 型別轉換 (Cast)
* 間接運算 (解參考)
& 取址運算
sizeof Size-of[註 2]
_Alignof 對齊要求(C11)
3 * / % 乘法、除法與餘數 由左至右
4 + - 加法與減法
5 << >> 位元左移與右移
6 < <= 分別用於關係運算子 < 與 ≤
> >= 分別用於關係運算子 > 與 ≥
7 == != 分別用於關係運算子 = 與 ≠
8 & 位元 AND
9 ^ 位元 XOR (互斥或)
10 | 位元 OR (包含或)
11 && 邏輯 AND
12 || 邏輯 OR
13 ?: 三元條件運算[註 3] 由右至左
14[註 4] = 簡單賦值
+= -= 加法與減法賦值
*= /= %= 乘法、除法與餘數賦值
<<= >>= 位元左移與右移賦值
&= ^= |= 位元 AND、XOR 與 OR 賦值
15 , 逗號運算子 由左至右
  1. 前置 ++-- 的運算元不能是型別轉換。此規則在語法上禁止了某些語意上本身即無效的運算式。部分編譯器會忽略此規則並在語意上檢測其無效性。
  2. sizeof 的運算元不能是型別轉換:運算式 sizeof (int) * p 會被明確解析為 (sizeof(int)) * p,而非 sizeof((int)*p)
  3. 條件運算子中間的運算式(位於 ?: 之間)會被解析為如同加上括號一般:它相對於 ?: 的優先順序會被忽略。
  4. 賦值運算子的左運算元必須是一元(非型別轉換的等級 2)運算式。此規則在語法上禁止了某些語意上本身即無效的運算式。許多編譯器會忽略此規則並在語意上檢測其無效性。例如,e = a < d ? a++ : a = d 是一個由於此規則而無法被解析的運算式。然而,許多編譯器會忽略此規則並將其解析為 e = ( ((a < d) ? (a++) : a) = d ),隨後因其語意無效而報錯。

解析運算式時,某行所列的運算子與其引數的結合會比位於該行下方之任何運算子更緊密(如同加上括號)。例如,運算式 *p++ 被解析為 *(p++),而非 (*p)++

位於同一儲存格的運算子(一個儲存格中可能列有多行運算子)會以相同的優先順序,並按給定的方向進行求值。例如,運算式 a=b=c 會因右至左的結合性被解析為 a=(b=c),而非 (a=b)=c

[編輯] 註釋

優先順序與結合性獨立於求值順序之外。

標準本身並未指定優先順序等級。它們是從語法中推導出來的。

在 C++ 中,條件運算子與賦值運算子具有相同的優先順序,且前置 ++-- 以及賦值運算子對其運算元沒有上述限制。

結合性的定義對於一元運算子是多餘的,僅為了完整性而標示:一元前置運算子總是由右至左結合(sizeof ++*psizeof(++(*p))),而一元後置運算子總是由左至右結合(a[1][2]++((a[1])[2])++)。請注意,結合性對於成員存取運算子是有意義的,儘管它們被歸類於一元後置運算子:a.b++ 會被解析為 (a.b)++,而非 a.(b++)

[編輯] 參考文獻

  • C17 標準 (ISO/IEC 9899:2018)
  • A.2.1 運算式
  • C11 標準 (ISO/IEC 9899:2011)
  • A.2.1 運算式
  • C99 標準 (ISO/IEC 9899:1999)
  • A.2.1 運算式
  • C89/C90 標準 (ISO/IEC 9899:1990)
  • A.1.2.1 運算式

[編輯] 參見

執行期間運算子引數的求值順序

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

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->b
a.b

a(...)
a, b
(型別) a
a ? b : c
sizeof


_Alignof
(自 C11 起)
(C23 之前)

alignof
(C23 起)

C++ 文件 關於 C++ 運算子優先順序
English Deutsch 日本語 한국어 中文(简体) 中文(繁體)