語法書 / AA 競程語法書 上冊 / 附錄 / C. 運算子優先順序速查表

C. 運算子優先順序速查表

優先順序從高到低排列。同優先順序的運算子按結合律(從左至右或從右至左)評估。這裡只列上冊實際用到的運算子;完整表格(含位元運算、三元運算子等 Level 1 之後的內容)可查 cppreference 的 C++ operator precedence

表中的優先級沿用 cppreference 的編號:數字越小越先算。小括號 () 可以直接改變運算順序,雖然它不是一般二元運算子,初學時可以把它當成「最高優先」來記。

優先級 運算子 說明 結合律 範例
最高 () 分組,強制先算括號內 - (a + b) * c
1 :: 範圍解析,指定命名空間裡的名字 從左至右 std::cout
2 [] 陣列下標 從左至右 a[i]grid[i][j]
2 () 函式呼叫 從左至右 max(a, b)f(x)
2 . 成員存取(存取物件裡的名字) 從左至右 cin.eof()
2 ++ (後置)、-- (後置) 後置自增/自減 從左至右 i++
3 ++ (前置)、-- (前置) 前置自增/自減 從右至左 ++i
3 +- (單元) 正號、負號 從右至左 +x-x
3 ! 邏輯非 從右至左 !flag
3 (type) C-style 強制型態轉換 從右至左 (long long)x * y
3 sizeof 查詢型態或物件大小 從右至左 sizeof(int)sizeof a
5 */% 乘、除、取餘 從左至右 a * b / c % d
6 +- 加、減 從左至右 a + b - c
7 <<>> coutcin 的輸出入串接(本義是位元位移,Level 1 再學) 從左至右 cout << xcin >> x
9 <<=>>= 大小比較 從左至右 a < b
10 ==!= 相等、不相等 從左至右 a == b
14 && 邏輯且 從左至右 a && b && c
15 || 邏輯或 從左至右 a || b || c
16 =+=-=*=/=%= 指派、算術複合指派 從右至左 a = b = cx += 5

常見的優先級陷阱:

  1. cout<< 優先級高於比較運算子

    • cout << x <= y 會被解讀為 (cout << x) <= y
    • ✓ 要輸出比較結果,寫成 cout << (x <= y)
  2. && 優先於 ||

    • a || b && c 被解讀為 a || (b && c)
    • ✓ 要表達 (a || b) && c 需加括號
  3. 比較運算子不能連寫

    • if (a < b < c) 等於 if ((a < b) < c) = if (1 < c)if (0 < c)(取決於 a < b
    • if (a < b && b < c)
  4. []、函式呼叫、後置 ++ 都排得很前面

    • a[i + 1] 會先算出索引 i + 1,再取 a[...]
    • f(x) + g(y) 會先各自完成函式呼叫,再做加法
  5. +- 同優先級,從左至右結合

    • a - b + c = (a - b) + c
    • a + b - c = (a + b) - c