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 | <<、>> |
cout/cin 的輸出入串接(本義是位元位移,Level 1 再學) |
從左至右 | cout << x、cin >> x |
| 9 | <、<=、>、>= |
大小比較 | 從左至右 | a < b |
| 10 | ==、!= |
相等、不相等 | 從左至右 | a == b |
| 14 | && |
邏輯且 | 從左至右 | a && b && c |
| 15 | || |
邏輯或 | 從左至右 | a || b || c |
| 16 | =、+=、-=、*=、/=、%= |
指派、算術複合指派 | 從右至左 | a = b = c、x += 5 |
常見的優先級陷阱:
cout的<<優先級高於比較運算子- ✗
cout << x <= y會被解讀為(cout << x) <= y - ✓ 要輸出比較結果,寫成
cout << (x <= y)
- ✗
&&優先於||- ✗
a || b && c被解讀為a || (b && c) - ✓ 要表達
(a || b) && c需加括號
- ✗
比較運算子不能連寫
- ✗
if (a < b < c)等於if ((a < b) < c)=if (1 < c)或if (0 < c)(取決於a < b) - ✓
if (a < b && b < c)
- ✗
[]、函式呼叫、後置++都排得很前面a[i + 1]會先算出索引i + 1,再取a[...]f(x) + g(y)會先各自完成函式呼叫,再做加法
+和-同優先級,從左至右結合a - b + c=(a - b) + ca + b - c=(a + b) - c