C # 運算子和運算式 (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];

var numbers = new List<int>(new[] { 1, 2, 3 });
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 # 中使用查詢功能:

    var scores = new[] { 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) [i]x?.yx?[y]x + +x--x!newtypeofcheckeduncheckeddefaultnameofdelegatesizeofstackallocx >y 主要
+ x-x ! x~ x+ + x--x^ x (T) xawait&x* xtrue 和 false 一元 (Unary)
x. y 範圍
switch switch 運算式
with 運算式
x * yx / yx % y 乘法
x + yx – y 加法
x << y, x >> y Shift
x < y, x > yx <= y, x > = yas 關聯性和型別測試
x = = yx! = 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 + = yx-= yx * = yx/= yx% = yx &= y、x |= y、x ^ =y、 x <<= yx >>= yx??= y=> 指派和 Lambda 宣告

運算子關聯性

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

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

使用括弧來變更由運算子關聯性強制執行的評估順序:

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 (&&) 或 (||) 運算子、 null 聯合運算子 ????= null 條件運算子 ?.?[] 條件運算子 ?: 。 如需詳細資訊,請參閱每個運算子的描述。

C# 語言規格

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

另請參閱