首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 邏輯運算子完整指南:&&、||、! 真值表、優先級與多載機制

     編輯:關於C#

C# 提供三大邏輯運算子構成布林代數基礎:條件 AND (&&)、條件 OR (||)、邏輯非 (!)。本文系統整理真值表、優先級規則、短路語意與自訂型別多載機制。

三大運算子速覽

運算子名稱元數短路可多載
&&條件邏輯 AND二元是間接 (透過 true/false & &/|)
||條件邏輯 OR二元是間接 (透過 true/false & &/|)
!邏輯非一元N/A是

標準真值表

ab!aa && ba || b
truetruefalsetruetrue
truefalsefalsefalsetrue
falsetruetruefalsetrue
falsefalsetruefalsefalse

優先級與結合性

優先級 (高→低):! > && > ||
結合性:左結合

隱含括號範例:

!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

與位元邏輯運算子 (&, |) 的關鍵差異

維度&&, ||&, |
短路是否
運算元類型僅 boolbool、整數類型
多載方式定義 operator true/false + operator &/|直接定義 operator &/|
編譯目標分支指令位元運算指令 / 方法呼叫

自訂型別支援短路邏輯 (進階)

需滿足三個條件:

  1. 定義 operator true 與 operator false
  2. 定義 operator & (對應 &&) 與 operator | (對應 ||)
  3. 回傳型別與運算元型別一致
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);
}

實用模式與慣用語

1. Null 條件鏈 (C# 6.0+)

// 等價於 a != null && a.B != null && a.B.C != null
var result = a?.B?.C?.DoSomething();

2. Null 合併運算子

var name = user?.Name ?? "Anonymous";

3. 守衛條件

public void Process(Item item)
{
    if (item == null || !item.IsValid) return; // 短路保護
    // 核心邏輯...
}

4. 惰性評估

var expensive = ComputeExpensive(); // 不想總是執行
var result = useCache ? cachedValue : expensive; // 三元也短路
// 或
var result = useCache || (expensive = ComputeExpensive()) != null; // 利用 || 短路

常見錯誤與誤區

  1. 混淆 & 與 &&:if (obj != null & obj.Method()) 會拋出 NRE
  2. 副作用依賴短路:if (Flag() || DoSomething()) 中 DoSomething 可能不執行
  3. 優先級錯誤:!a && b 是 (!a) && b,非 !(a && b)
  4. 非布林類型使用:int x = 5; if (x) {} 編譯錯誤 (需 x != 0)

效能考量

  • &&/|| 編譯為條件分支指令,極快
  • 分支預測友善:可預測模式 (如守衛條件) 效能最佳
  • 避免在熱路徑中呼叫複雜屬性/方法作為運算元
  • 自訂型別多載有方法呼叫開銷,權衡可讀性與效能

精通邏輯運算子的短路語意、優先級與多載機制,能編寫出更安全、高效且具表達力的條件邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved