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

3.4 運算子優先順序

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

目前學過的運算子,只要記住這個「由先到後」的相對順序就夠了:

括號 ()! > 算術(* / %+ -)> 比較(< > == …)> &&|| > 指派 =

換句話說,幾個最常用、一定要記住的重點:

  1. 括號 () 一定最先算(跟數學一樣)。
  2. ! 排得非常前面(只輸給括號),它只作用在緊跟著的那一個東西上。所以要否定「整個比較式」請寫 !(x >= 0)——寫成 !x >= 0 會變成先算 !x、再拿結果跟 0 比,意思完全不同。
  3. 算術運算子中「先乘除、後加減」(*/% 高於 +-)。
  4. 所有算術運算子都高於比較運算子;比較運算子又高於 &&|| 這些邏輯運算子。
  5. && 的優先級高於 ||

若記不清楚,最保險的做法就是加上小括號 ()——多加幾個絕對不會錯,也讓別人一看就懂。

複雜表達式範例

#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 的優先順序。試著用括號改寫它,確認你的理解是否正確。