C# 提供三大邏輯運算子構成布林代數基礎:條件 AND (&&)、條件 OR (||)、邏輯非 (!)。本文系統整理真值表、優先級規則、短路語意與自訂型別多載機制。
| 運算子 | 名稱 | 元數 | 短路 | 可多載 |
|---|---|---|---|---|
&& | 條件邏輯 AND | 二元 | 是 | 間接 (透過 true/false & &/|) |
|| | 條件邏輯 OR | 二元 | 是 | 間接 (透過 true/false & &/|) |
! | 邏輯非 | 一元 | N/A | 是 |
| a | b | !a | a && b | a || b |
|---|---|---|---|---|
| true | true | false | true | true |
| true | false | false | false | true |
| false | true | true | false | true |
| false | false | true | false | false |
優先級 (高→低):! > && > || 結合性:左結合
隱含括號範例:
!a && b || c // ((!a) && b) || c a || !b && c // a || ((!b) && c) !a || !b && c // (!a) || ((!b) && c)
// && : 左邊 false → 直接回傳 false,右邊不執行
// || : 左邊 true → 直接回傳 true,右邊不執行
bool FlagA() { Console.WriteLine("A"); return true; }
bool FlagB() { Console.WriteLine("B"); return false; }
var r1 = FlagA() && FlagB(); // 輸出 A, B → r1=false
var r2 = FlagB() && FlagA(); // 輸出 B → r2=false (短路,A 不執行)
var r3 = FlagA() || FlagB(); // 輸出 A → r3=true (短路,B 不執行)
var r4 = FlagB() || FlagA(); // 輸出 B, A → r4=true
| 維度 | &&, || | &, | |
|---|---|---|
| 短路 | 是 | 否 |
| 運算元類型 | 僅 bool | bool、整數類型 |
| 多載方式 | 定義 operator true/false + operator &/| | 直接定義 operator &/| |
| 編譯目標 | 分支指令 | 位元運算指令 / 方法呼叫 |
需滿足三個條件:
operator true 與 operator falseoperator & (對應 &&) 與 operator | (對應 ||)public readonly struct Option{ public bool HasValue { get; } public T Value { get; } public static bool operator true(Option opt) => opt.HasValue; public static bool operator false(Option opt) => !opt.HasValue; // 短路 AND:左邊無值 → 直接回傳左邊 (不評估右邊) public static Option operator &(Option left, Option right) => left.HasValue ? right : left; // 短路 OR:左邊有值 → 直接回傳左邊 (不評估右邊) public static Option operator |(Option left, Option right) => left.HasValue ? left : right; public static Option operator !(Option opt) => opt.HasValue ? None : Some(default); }
// 等價於 a != null && a.B != null && a.B.C != null var result = a?.B?.C?.DoSomething();
var name = user?.Name ?? "Anonymous";
public void Process(Item item)
{
if (item == null || !item.IsValid) return; // 短路保護
// 核心邏輯...
}
var expensive = ComputeExpensive(); // 不想總是執行 var result = useCache ? cachedValue : expensive; // 三元也短路 // 或 var result = useCache || (expensive = ComputeExpensive()) != null; // 利用 || 短路
if (obj != null & obj.Method()) 會拋出 NREif (Flag() || DoSomething()) 中 DoSomething 可能不執行!a && b 是 (!a) && b,非 !(a && b)int x = 5; if (x) {} 編譯錯誤 (需 x != 0)&&/|| 編譯為條件分支指令,極快精通邏輯運算子的短路語意、優先級與多載機制,能編寫出更安全、高效且具表達力的條件邏輯。