C 運算子優先順序
下表列出了 C 運算子的優先順序和結合性。運算子從上到下按優先順序遞減的順序排列。
優先順序 | 運算子 | 描述 | 結合性 |
---|---|---|---|
1 | ++ --
|
字尾/後置增量和減量 | 從左到右 |
()
|
函式呼叫 | ||
[]
|
陣列下標 | ||
.
|
結構體和聯合體成員訪問 | ||
->
|
透過指標訪問結構體和聯合體成員 | ||
(type){list}
|
複合字面量(C99) | ||
2 | ++ --
|
前置增量和減量[注 1] | 從右到左 |
+ -
|
一元加和減 | ||
! ~
|
邏輯非和按位非 | ||
(type)
|
型別轉換 | ||
*
|
間接定址(解引用) | ||
&
|
取地址 | ||
sizeof
|
大小[注 2] | ||
_Alignof
|
對齊要求(C11) | ||
3 | * / %
|
乘法、除法和取模 | 從左到右 |
4 | + -
|
加法和減法 | |
5 | << >>
|
按位左移和右移 | |
6 | < <=
|
分別用於關係運算符 < 和 ≤ | |
> >=
|
分別用於關係運算符 > 和 ≥ | ||
7 | == !=
|
分別用於關係運算符 = 和 ≠ | |
8 | &
|
按位與 | |
9 | ^
|
按位異或(排他或) | |
10 | |
|
按位或(包含或) | |
11 | &&
|
邏輯與 | |
12 | ||
|
邏輯或 | |
13 | ?:
|
三元條件[注 3] | 從右到左 |
14[注 4] | =
|
簡單賦值 | |
+= -=
|
和差賦值 | ||
*= /= %=
|
積、商和餘數賦值 | ||
<<= >>=
|
按位左移和右移賦值 | ||
&= ^= |=
|
按位與、異或和或賦值 | ||
15 | ,
|
逗號 | 從左到右 |
- ↑ 前置
++
和--
的運算元不能是型別轉換。此規則在語法上禁止了一些本來在語義上也是無效的表示式。一些編譯器會忽略此規則,並從語義上檢測其無效性。 - ↑
sizeof
的運算元不能是型別轉換:表示式 sizeof (int) * p 被明確解釋為 (sizeof(int)) * p,而不是 sizeof((int)*p)。 - ↑ 條件運算子中間的表示式(在
?
和:
之間)被解析為帶括號的表示式:它相對於?:
的優先順序被忽略。 - ↑ 賦值運算子的左運算元必須是一元(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 ++*p 是 sizeof(++(*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 |
+a |
!a |
a == b |
a[b] |
a(...) |
C++ 文件,關於 C++ 運算子優先順序
|