布爾運算符求值結果為 `true` 或 `false`,是控制流程 (if/while/for) 的核心。C# 提供以下類別:
取反布爾值:
bool ready = true;
bool notReady = !ready; // false
// 等價於
bool notReady2 = (ready == false);
比較**同類型**兩值是否相等:
| 運算符 | 含義 | 示例 (age=42) | 結果 |
|---|---|---|---|
| == | 等於 | age == 100 | false |
| != | 不等於 | age != 0 | true |
⚠️ **陷阱**:`==` (比較) vs `=` (賦值)。`if (x = 5)` 編譯錯誤 (C# 要求條件為 bool),但 `if (x == 5)` 正確。
比較大小關係 (數值類型/實現 `IComparable`):
| 運算符 | 含義 | 示例 (age=42) | 結果 |
|---|---|---|---|
| < | 小於 | age < 21 | false |
| <= | 小於等於 | age <= 18 | false |
| > | 大於 | age > 16 | true |
| >= | 大於等於 | age >= 30 | true |
**短路求值** 是核心特性:
// && 範例:百分比在 0-100 之間
bool valid = (percent >= 0) && (percent <= 100);
// || 範例:百分比超出範圍
bool invalid = (percent < 0) || (percent > 100);
// 避免空引用異常 (經典模式)
if (user != null && user.IsActive) { ... }
// user 為 null 時,短路不訪問 user.IsActive
// 性能優化:將廉價/快速判斷放左側
if (FastCheck() && ExpensiveCheck()) { ... }
// FastCheck 為 false 時跳過昂貴操作
// ❌ 錯誤:關係運算符鏈接 (數學寫法無效)
if (0 <= percent <= 100) // 編譯錯誤:bool 不能與 int 比較
// ✅ 正確:拆分為兩個關係表達式用 && 連接
if (percent >= 0 && percent <= 100)
// ❌ 錯誤:變量重複省略
if (percent >= 0 && <= 100) // 編譯錯誤
// ✅ 正確:完整表達式
if (percent >= 0 && percent <= 100)
// 推薦:加括號提升可讀性 (雖優先級已正確)
if ((percent >= 0) && (percent <= 100))
**非短路**,總是計算兩側:
| 運算符 | 名稱 | 真值表 (A op B) |
|---|---|---|
| & | 邏輯與 | 僅雙真為真 |
| | | 邏輯或 | 至少一真為真 |
| ^ | 邏輯異或 | 一真一假為真 |
bool a = true, b = false;
Console.WriteLine(a & b); // false (計算兩側)
Console.WriteLine(a && b); // false (短路,b 不計算)
Console.WriteLine(a | b); // true
Console.WriteLine(a ^ b); // true
💡 **用途**:罕見。需**強制執行兩側有副作用的方法**時:`if (MethodA() & MethodB())` 確保兩者均執行。日常**首選 `&&`/`||`**。
| 類別 | 運算符 | 結合性 |
|---|---|---|
| 主要 | `()` `++` `--` (後綴) | 左 |
| 一元 | `!` `+` `-` `++` `--` (前綴) | 右 |
| 乘法 | `*` `/` `%` | 左 |
| 加法 | `+` `-` | 左 |
| 關係 | `<` `<=` `>` `>=` | 左 |
| 相等 | `==` `!=` | 左 |
| 條件與 | `&&` | 左 |
| 條件或 | `||` | 左 |
| 賦值 | `=` `+=` `-=` `*=` `/=` `%=` | 右 |
💡 **口訣**:一元 > 算術 > 關係 > 相等 > 邏輯與 > 邏輯或 > 賦值。括號 `()` 可隨時提升優先級、消除歧義。