運算子優先級決定複雜運算式的隱含括號結構,是程式碼正確性與可讀性的基石。C# 定義了 14 級優先級,配合左/右結合性規則,構成確定性的解析邏輯。本文提供完整決策表、陷阱案例與實戰指南。
| 級別 | 類別 | 運算子 | 結合性 | 範例 |
|---|---|---|---|---|
| 1 | 主要運算子 | x.y f(x) a[x] x++ x-- new typeof sizeof checked unchecked default | 左 | obj.Method()[i]++ |
| 2 | 一元運算子 | + - ! ~ ++x --x (T)x | 右 | -x++ → -(x++) |
| 3 | 乘法性 | * / % | 左 | a * b / c → (a * b) / c |
| 4 | 加法性 | + - | 左 | a + b - c → (a + b) - c |
| 5 | 移位 | << >> | 左 | a << b >> c → (a << b) >> c |
| 6 | 關係/型別測試 | < > <= >= is as | 左 | a < b < c 錯誤 (需 a < b && b < c) |
| 7 | 等值 | == != | 左 | a == b == c 錯誤 (bool 無法比較 bool) |
| 8 | 邏輯 AND (位元) | & | 左 | a & b & c → (a & b) & c |
| 9 | 邏輯 XOR (位元) | ^ | 左 | a ^ b ^ c → (a ^ b) ^ c |
| 10 | 邏輯 OR (位元) | | | 左 | a | b | c → (a | b) | c |
| 11 | 條件 AND (短路) | && | 左 | a && b && c → (a && b) && c |
| 12 | 條件 OR (短路) | || | 左 | a || b || c → (a || b) || c |
| 13 | 條件運算子 | ?: | 右 | a ? b : c ? d : e → a ? b : (c ? d : e) |
| 14 | 指派 | = *= /= %= += -= <<= >>= &= ^= |= | 右 | a = b = c → a = (b = c) |
-x++ // 解析:-(x++) 而非 (-x)++ // x++ 先執行 (後綴屬主要運算子,級別 1) // 再套用 - (一元負號,級別 2) ~x++ // ~(x++) !x++ // !(x++) (int)x++ // (int)(x++)
a + b << c // (a + b) << c — 加法性 (級別 4) 高於移位 (級別 5) // 易誤以為 a + (b << c) a << b + c // a << (b + c) — 同理
// a < b < c // CS0019: 無法將 bool 轉換為 int // 正確寫法 a < b && b < c
a ? b : c ? d : e // 解析:a ? b : (c ? d : e) // 而非 (a ? b : c) ? d : e // 實際語意:a 為真 → b;a 為假 → 評估 c ? d : e
int x = 0; x = x = 5; // x = (x = 5) → 先 x=5,再 x=5 (結果 5) // 陷阱:屬性副作用 obj.Prop = obj.Prop = 5; // 依序:右邊 set(5),左邊 set(5) — 兩次呼叫 set
!a == b // (!a) == b — ! (級別 2) 高於 == (級別 7) // 易誤以為 !(a == b) !a && b // (!a) && b — 正確 !(a && b) // 需明確括號
a | b && c // a | (b && c) — && (級別 11) 高於 | (級別 10) // 位元 OR 優先級低於條件 AND!
1. 識別所有運算子 2. 依優先級分組 (高→低) 3. 同優先級依結合性分組 (左/右) 4. 特殊規則檢查: - 關係運算子不可鏈結 - 等值運算子不可鏈結 (bool 結果) - 條件運算子右結合 - 指派右結合 5. 加上隱含括號驗證語意
| 情況 | 建議 | 範例 |
|---|---|---|
| 跨優先級組合 | 建議加括號 | (a + b) << c 而非 a + b << c |
| 位元邏輯與條件邏輯混用 | 必須加括號 | a | (b && c) |
| 條件運算子巢狀 | 必須加括號或重構 | a ? b : (c ? d : e) |
| 指派在運算式中 | 避免 / 明確括號 | x = (y = 5) |
| 標準算術運算式 | 可選 (數學慣例) | a + b * c 可接受 |
| 複雜布林邏輯 | 建議加括號分組 | (a && b) || (c && d) |
SyntaxVisualizer 或線上工具?? (級別 12, 條件 OR 旁)、?. (級別 1, 主要)、is/as (級別 6, 關係)is/switch 為語法結構,非運算子,不影響優先級精通優先級表與結合性規則,並養成「不確定就加括號」的習慣,能消除 90% 以上的運算式解析 Bug,並編寫出自文檔化的清晰程式碼。