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

C# 運算子與運算式總覽:分類、優先級、求值策略與語言設計哲學

     編輯:關於C#

C# 的運算子與運算式系統繼承自 C/C++ 並針對型別安全、元件導向與現代語言特性進行深度重設計。本文提供全景式總覽,涵蓋分類體系、優先級規則、求值策略與核心設計哲學,為深入掌握各運算子奠定基礎。

運算式與運算子核心概念

  • 運算式:由運算子、運算元 (字面值、變數、方法呼叫、屬性存取等) 與標點符號組成的計算單元,產生值 (或 void)
  • 運算子:定義對運算元執行的操作符號或關鍵字 (如 +, ==, new, typeof, await)
  • 運算元:運算子操作的對象,可為常數、變數、運算式結果

運算子分類體系 (依運算元個數)

分類運算元數代表運算子特徵
一元運算子1+, -, !, ~, ++, --, (T), typeof, sizeof, await, nameof, default前綴/後綴區別
二元運算子2+, -, *, /, %, &&, ||, &, |, ^, ==, !=, <, >, is, as, ??, + (字串/委派)中置語法
三元運算子3?: (條件運算子)唯一三元、右結合
特殊運算子N/Anew, typeof, sizeof, checked, unchecked, default, nameof, stackalloc, -> (Lambda), => (運算式主體)關鍵字形式、語法糖

運算子功能分類 (依用途)

  1. 主要運算子:x.y, f(x), a[x], x++, x--, new, typeof, sizeof, checked, unchecked, default
  2. 一元運算子:+, -, !, ~, ++x, --x, (T)x
  3. 乘法性運算子:*, /, %
  4. 加法性運算子:+, -
  5. 移位運算子:<<, >>
  6. 關係運算子:<, >, <=, >=, is, as
  7. 等值運算子:==, !=
  8. 邏輯 AND:&
  9. 邏輯 XOR:^
  10. 邏輯 OR:|
  11. 條件 AND:&& (短路)
  12. 條件 OR:|| (短路)
  13. 條件運算子:?:
  14. 指派運算子:=, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |=
  15. Lambda/查詢運算子:=>, from, where, select...

優先級與結合性完整表 (高→低)

1. 主要運算子          : x.y  f(x)  a[x]  x++  x--  new  typeof  sizeof  checked  unchecked  default
2. 一元運算子          : +  -  !  ~  ++x  --x  (T)x
3. 乘法性運算子        : *  /  %
4. 加法性運算子        : +  -
5. 移位運算子          : <<  >>
6. 關係運算子          : <  >  <=  >=  is  as
7. 等值運算子          : ==  !=
8. 邏輯 AND (位元)     : &
9. 邏輯 XOR (位元)     : ^
10. 邏輯 OR (位元)     : |
11. 條件 AND (短路)    : &&
12. 條件 OR (短路)     : ||
13. 條件運算子         : ?:
14. 指派運算子         : =  *=  /=  %=  +=  -=  <<=  >>=  &=  ^=  |=

關鍵結合性規則

  • 左結合 (大多數二元運算子):a + b + c → (a + b) + c
  • 右結合:指派運算子 (a = b = c → a = (b = c))、條件運算子 (a ? b : c ? d : e → a ? b : (c ? d : e))
  • 無結合:關係運算子鏈 (a < b < c 編譯錯誤,需 a < b && b < c)

求值策略:嚴格左至右 (核心保證)

C# 標準規定:運算元與引數按書寫順序由左至右評估,與運算子優先級無關。

static int F(string s) { Console.Write(s); return 1; }

int x = F("A") + F("B") * F("C"); 
// 輸出順序:A B C
// 計算順序:1 + (1 * 1) = 2
// 副作用順序:A→B→C (左至右)

副作用順序保證的重要性

  • 方法呼叫副作用 (I/O、狀態變更)
  • 遞增/遞減運算子副作用
  • 指派運算子副作用
  • await 等待點順序

型別系統與運算子的深度整合

運算子多載 (使用者定義型別)

public readonly struct Rational
{
    public int Num, Den;
    
    public static Rational operator +(Rational a, Rational b) 
        => new Rational { Num = a.Num * b.Den + b.Num * a.Den, Den = a.Den * b.Den };
    
    public static bool operator ==(Rational a, Rational b) 
        => a.Num * b.Den == b.Num * a.Den;
    public static bool operator !=(Rational a, Rational b) => !(a == b);
    
    // 必須成對多載:==/!=, /<=/>=
    public static bool operator <(Rational a, Rational b) 
        => a.Num * b.Den < b.Num * a.Den;
    // ... 其他比較運算子
}

隱含/顯式轉換運算子

public readonly struct Celsius
{
    public double Value;
    public static implicit operator double(Celsius c) => c.Value;
    public static explicit operator Celsius(double d) => new Celsius { Value = d };
}

true/false 運算子 (支援短路邏輯)

public readonly struct Optional
{
    public bool HasValue { get; }
    public static bool operator true(Optional o) => o.HasValue;
    public static bool operator false(Optional o) => !o.HasValue;
    public static Optional operator &(Optional a, Optional b) 
        => a.HasValue ? b : a; // 短路 AND
}

現代 C# 運算子演進 (重要里程碑)

版本新增運算子/特性影響
C# 2.0?? (null 合併), ?: 可為 null 型別Null 安全模式
C# 3.0Lambda =>, 擴充方法, LINQ 查詢運算子函數式風格、資料查詢
C# 6.0nameof, ?. (null 條件), ??=, 字串插值 $""防禦性程式設計、可讀性
C# 7.0模式比對 is, switch, 元組解構, ref 回傳型別驅動邏輯、解構
C# 8.0switch 運算式, ?. 索引子, 非同步串流運算式導向、模式完整
C# 9.0not, and, or 模式, with 運算式 (record)模式邏輯組合、不可變更新
C# 10.0插值字串處理器, global using, record struct字串效能、結構記錄
C# 11.0List 模式, required 成員, 原始字串常值集合模式、建構安全
C# 12.0主建構函式, 集合運算式 [], ref readonly 參數簡潔建構、集合字面值

設計哲學與最佳實踐原則

1. 型別安全優先

  • 無隱含窄化轉換 (int → short 需顯式)
  • 運算子多載保持語意一致性
  • is/as 取代不安全轉型

2. 明確語意、避免驚訝

  • 整數除法截斷、溢位環繞 (預設 unchecked)
  • 浮點數 NaN/Infinity 傳播
  • 字串不可變、委派不可變

3. 效能可預測

  • 運算子對應單指令或少量指令
  • 無隱藏配置 (字串串接除外,編譯器優化)
  • 結構體值語意、無 GC 壓力

4. 運算式導向 (現代趨勢)

  • switch 運算式、Lambda、模式比對
  • 減少陳述式、增加不可變運算式
  • 函數式組合風格

學習路徑建議

  1. 掌握優先級表與左至右求值 — 基礎閱讀能力
  2. 精通短路邏輯 (&&/||/??) — 防禦性程式設計核心
  3. 理解各類型運算子語意差異 (數值/列舉/字串/委派) — 領域建模關鍵
  4. 學會運算子多載與轉換運算子 — 定義領域原語
  5. 掌握模式比對 (is/switch) — 現代條件邏輯主流
  6. 關注新版本運算子特性 — 提升表達力與安全性

C# 的運算子系統不只是語法糖,更是型別安全、效能可預測與領域表達力的核心基礎設施。系統性掌握它,是成為資深 C# 開發者的必經之路。

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