C語言運算子優先順序

2020-07-16 10:04:20
一個表示式可以包含多個運算子。在這種情況下,運算子的優先順序決定表示式的哪部分被處理為每個運算子的運算元。例如,按照運算規則,表示式中 *、/、以及 % 的優先順序比 + 和 - 高。如下列表示式:

a - b * c

相當於 a-(b*c)。如果想讓運算元以不同的方式組合在一起,則必須使用括號:

(a - b) * c

如果一個表示式中的兩個運算元具有相同的優先順序,那麼它們的結合律(associativity)決定它們的組合方式是從左到右或是從右到左。例如,算術運算子和運算元的組合方式是從左到右,賦值運算子則是從右到左,如表 1 所示。

表1 運算子組合方式
表示式 結合律 組合方式
a/b%c 從左到右 (a/b)%c
a=b=c 從右到左 a=(b=c)

表 2 列出優先順序次序下,所有 C 語言運算子的優先順序和結合律

表2 運算子優先順序和結合律
優先順序 運算子 結合律
1 字尾運算子:[]    ()    ·    ->    ++    --(型別名稱){列表} 從左到右
2 一元運算子:++    --    !    ~    +    -    *    &    sizeof_Alignof 從右到左
3 型別轉換運算子:(型別名稱) 從右到左
4 乘除法運算子:*    /    % 從左到右
5 加減法運算子:+    - 從左到右
6 移位運算子:<<    >> 從左到右
7 關係運算子:<<=    >>= 從左到右
8 相等運算子:==    != 從左到右
9 位運算子 AND:& 從左到右
10 位運算子 XOR:^ 從左到右
11 位運算子 OR:| 從左到右
12 邏輯運算子 AND:&& 從左到右
13 邏輯運算子 OR:|| 從左到右
14 條件運算子:?: 從右到左
15 賦值運算子:
     =         +=        -=       *=       /=      %=       &=       ^=      |=   
   <<=      >>=
從右到左
16 逗號運算子:, 從左到右

表 2 中優先順序最高的運算子中的最後一個(型別名稱){列表} 是 C99 新增加的。

一些運算子記號在表 2 中出現了兩次。例如,自增運算子 ++ 和自減運算子 --,在作字尾運算子(如表示式 x++)時,較其用作字首運算子(如表示式 ++x)時,具有較高的優先順序。

+、-、* 和 & 運算子記號不但可以當作一元運算子(unary operator,只需要一個運算元),也可以當作二元運算子(binary operator,需要兩個運算元)。例如,* 只有一個運算元的時候,就是間接運算子(indirection operator),而有兩個運算元的時候,就是乘號。

在這些例子中,一元運算子比二元運算子具有更高的優先順序。例如,表示式 *ptrl**ptr2 等同於表示式(*ptrl)*(*ptr2)。