3.4 運算子優先順序
當我們組合多個運算子時,需要知道哪個先執行。例如 !a && b || c 該怎麼理解?這就要看運算子優先順序(operator precedence)——就像數學裡「先乘除、後加減」一樣,C++ 也替每個運算子規定好了計算的先後次序。
¶優先順序(precedence)與結合律(associativity)
C++ 標準替每個運算子都定義了一個優先級(precedence)數字,規則很單純:
- 在同一個運算式裡,優先級數字越小的運算子越先計算。
- 如果好幾個運算子的優先級相同,就看它的結合律(associativity):大多數運算子是「由左到右」依序計算,少數(例如指派
=)是「由右到左」。
下表整理了目前學過的運算子,由先到後排列(優先級數字越小越先算):
| 優先級 | 運算子 | 意義 | 結合律 |
|---|---|---|---|
| 3 | ! |
邏輯非 | 由右到左 |
| 5 | * / % |
乘、除、取餘 | 由左到右 |
| 6 | + - |
加、減 | 由左到右 |
| 9 | < <= > >= |
大小比較 | 由左到右 |
| 10 | == != |
相等、不相等 | 由左到右 |
| 14 | && |
邏輯與 | 由左到右 |
| 15 | || |
邏輯或 | 由左到右 |
| 16 | = |
指派 | 由右到左 |
(優先級數字沿用 cppreference 的編號;中間跳過的號碼,是我們還沒學到的運算子。)
歸納幾個最常用、一定要記住的順序:
- 目前學過的運算子裡,
!的優先級最高。 - 算術運算子中,
*、/、%高於+、-(就是「先乘除、後加減」)。 - 所有算術運算子都高於比較運算子;比較運算子又高於
!以外的邏輯運算子。 &&的優先級高於||。
若記不清楚,最保險的做法就是加上小括號 ()——括號一定最先算,就像數學裡一樣,多加幾個絕對不會錯。
¶複雜表達式範例
#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 的優先順序。試著用括號改寫它,確認你的理解是否正確。