語法書 / AA 競程語法書 上冊 / 第三單元 / 運算子優先順序

3.4 運算子優先順序

當我們組合多個運算子時,需要知道哪個先執行。例如 !a && b || c 該怎麼理解?這就要看運算子優先順序(operator precedence)——就像數學裡「先乘除、後加減」一樣,C++ 也替每個運算子規定好了計算的先後次序。

優先順序(precedence)與結合律(associativity)

C++ 標準替每個運算子都定義了一個優先級(precedence)數字,規則很單純:

  • 在同一個運算式裡,優先級數字越小的運算子越先計算
  • 如果好幾個運算子的優先級相同,就看它的結合律(associativity):大多數運算子是「由左到右」依序計算,少數(例如指派 =)是「由右到左」。

下表整理了目前學過的運算子,由先到後排列(優先級數字越小越先算):

優先級 運算子 意義 結合律
3 ! 邏輯非 由右到左
5 * / % 乘、除、取餘 由左到右
6 + - 加、減 由左到右
9 < <= > >= 大小比較 由左到右
10 == != 相等、不相等 由左到右
14 && 邏輯與 由左到右
15 || 邏輯或 由左到右
16 = 指派 由右到左

(優先級數字沿用 cppreference 的編號;中間跳過的號碼,是我們還沒學到的運算子。)

歸納幾個最常用、一定要記住的順序:

  1. 目前學過的運算子裡,! 的優先級最高。
  2. 算術運算子中,*/% 高於 +-(就是「先乘除、後加減」)。
  3. 所有算術運算子都高於比較運算子;比較運算子又高於 ! 以外的邏輯運算子。
  4. && 的優先級高於 ||

若記不清楚,最保險的做法就是加上小括號 ()——括號一定最先算,就像數學裡一樣,多加幾個絕對不會錯。

複雜表達式範例

#include <iostream>
using namespace std;

int main() {
    int x = 5;
    int y = 10;
    int z = 15;

    cout << boolalpha;

    // 表達式:x > 3 && y < 20 || z == 15
    // 優先順序:比較 > 邏輯與 > 邏輯或
    // 實際理解:(x > 3) && (y < 20) || (z == 15)
    // 進一步:((x > 3) && (y < 20)) || (z == 15)
    bool result = x > 3 && y < 20 || z == 15;
    cout << "Result: " << result << endl;  // true

    return 0;
}

動手試試看

寫一個程式驗證:a > b && c < d || e == f 的優先順序。試著用括號改寫它,確認你的理解是否正確。