共用方式為


C# 運算子與運算式

C# 提供一些運算符。 其中許多都受到 內建型 別的支援,並可讓您使用這些類型的值來執行基本作業。 這些運算子包括下列群組:

一般而言,您可以 多載 這些運算元,也就是指定使用者定義型別作數的運算符行為。

最簡單的 C# 運算式是常值(例如 整數 數)和變數的名稱。 您可以使用運算子將它們合併成複雜的運算式。 運算符 優先順序關聯性 會決定執行表達式中作業的順序。 您可以使用括號來變更運算符優先順序和關聯性所強加的評估順序。

在下列程式代碼中,表達式的範例位於指派右側:

int a, b, c;
a = 7;
b = a;
c = b++;
b = a + b * c;
c = a >= 100 ? b : c / 10;
a = (int)Math.Sqrt(b * b + c * c);

string s = "String literal";
char l = s[s.Length - 1];

List<int> numbers = [..collection];
b = numbers.FindLast(n => n > 1);

一般而言,表達式會產生結果,而且可以包含在另一個表達式中。 void方法呼叫是不會產生結果的表達式範例。 它只能當做 語句使用,如下列範例所示:

Console.WriteLine("Hello, world!");

以下是 C# 提供的其他類型的運算式:

  • 插入字串表示式 ,可提供方便的語法來建立格式化字串:

    var r = 2.3;
    var message = $"The area of a circle with radius {r} is {Math.PI * r * r:F3}.";
    Console.WriteLine(message);
    // Output:
    // The area of a circle with radius 2.3 is 16.619.
    
  • 可讓您建立匿名函式的 Lambda 運算式

    int[] numbers = { 2, 3, 4, 5 };
    var maximumSquare = numbers.Max(x => x * x);
    Console.WriteLine(maximumSquare);
    // Output:
    // 25
    
  • 可讓您直接在 C# 中使用查詢功能的查詢表示式

    int[] scores = { 90, 97, 78, 68, 85 };
    IEnumerable<int> highScoresQuery =
        from score in scores
        where score > 80
        orderby score descending
        select score;
    Console.WriteLine(string.Join(" ", highScoresQuery));
    // Output:
    // 97 90 85
    

您可以使用 表達式主體定義 ,為方法、建構函式、屬性、索引器或完成項提供簡潔的定義。

運算元優先順序

在具有多個運算子的表達式中,會先評估優先順序較高的運算符,再評估優先順序較低的運算符。 在下列範例中,會先執行乘法,因為它的優先順序高於加法:

var a = 2 + 2 * 2;
Console.WriteLine(a); //  output: 6

使用括號來變更運算元優先順序所強加的評估順序:

var a = (2 + 2) * 2;
Console.WriteLine(a); //  output: 8

下表列出從最高優先順序到最低優先順序的 C# 運算符。 每個數據列內的運算子具有相同的優先順序。

運營商 類別或名稱
x.yf(x)a[i], , , x?.yx?[y]x++x-- , x!newtypeofcheckeduncheckeddefaultnameofdelegatesizeofstackallocx-y> 主要
+x-x!x~x、 ++x、 -x^x(T)xawait&x*xtrue 和 false 單一運算
x..y 範圍
switchwith switchwith 表達式
x * yx / yx % y 乘法
x + yx – y 添加劑
x << yx >> yx >>> y 轉變
x < yx > yx <= yx >= yisas 關係型和類型測試
x == y,x!= y 平等
x & y 布爾邏輯 AND位邏輯 AND
x ^ y 布爾邏輯 XOR位邏輯 XOR
x | y 布爾邏輯 OR位邏輯 OR
x & y 條件式 AND
x ||y 條件式 OR
x ?? y Null 聯合運算符
c ? t : f 條件運算元
x = yx += y, x -= y, x *= y, x /= y, x %= y, x &= y, x |= y, x ^<<>>= y, x = y, x >>>??= y=> 指派和 Lambda 宣告

如需邏輯模式組合子優先順序的相關信息,請參閱 Patterns 一文的邏輯模式檢查優先順序和順序一節。

運算元關聯性

當運算子具有相同優先順序時,運算子的關聯性會決定執行作業的順序:

  • 左關聯 運算子會依左至右的順序進行評估。 除了 指派運算子Null 聯合運算子之外,所有二元運算子都是左關聯運算符。 例如, a + b - c 會評估為 (a + b) - c
  • 右關聯 運算子會依從右至左的順序進行評估。 指派運算子、Null 聯合運算元、Lambda 和 條件運算子 ?: 都是右關聯。 例如, x = y = z 會評估為 x = (y = z)

這很重要

在 表單 P?.A0?.A1的運算式中,如果 Pnull,則不會 A0 評估 或 A1 。 同樣地,在表單 P?.A0.A1的運算式中,因為 A0 當 為 null 時 P 不會評估,兩者都不是 A0.A1。 如需詳細資訊,請參閱 C# 語言規格

使用括弧來變更運算符關聯性所強加的評估順序:

int a = 13 / 5 / 2;
int b = 13 / (5 / 2);
Console.WriteLine($"a = {a}, b = {b}");  // output: a = 1, b = 6

作數評估

與運算符優先順序和關聯性無關,表達式中的作數會從左至右進行評估。 下列範例示範運算符和作數的評估順序:

表現 評估順序
a + b a、b、+
a + b * c a, b, c, *, +
a / b + c * d a, b, /, c, d, *, +
a / (b + c) * d a, b, c, +, /, d, *

一般而言,會評估所有運算符作數。 不過,某些運算子會有條件地評估作數。 也就是說,這類運算子最左邊作數的值會定義是否應該評估其他作數。 這些運算子是條件式邏輯 AND () 和 OR||&&運算子、Null 聯合運算子和 ??=、Null 條件運算子???[],以及條件運算子 ?.?:。 如需詳細資訊,請參閱每個運算子的描述。

C# 語言規格

如需詳細資訊,請參閱 C# 語言規格的下列幾節:

另請參閱