C# 運算子與運算式
C# 提供許多運算子。 其中許多都是由 內建型別支援,可讓您使用這些型別的值來執行基本作業。 這些運算子包含下列群組:
- 算術運算子,利用數值運算元執行算術運算
- 比較運算子,比較數值運算元
- 布林邏輯運算子,使用
bool
運算元執行邏輯運算 - 位元和移位運算子,使用整數資料型別的運算元執行位元或移位運算
- 相等運算子,檢查運算元是否相等
一般而言,您可以多載這些運算子,也就是指定使用者定義型別運算元的運算子行為。
最簡單的 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.y、f(x)、a[i]、x?.y 、x?[y] 、x++、x--、x!、new、typeof、checked、unchecked、default、nameof、delegate、sizeof、stackalloc、x->y |
主要 |
+x、-x、!x、~x、++x、--x、^x、(T)x、await、&x、*x、true 和 false | 一元 |
x..y | 範圍 |
switch、with | switch 和 with 運算式 |
x * y、x / y、x % y | 乘法 |
x + y、x – y | 加法 |
x << y、x >> y、x >>> y | Shift |
x < y、x > y、x <= y、x >= y、is、as | 關聯性和型別測試 |
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 = y、x += y、x -= y、x *= y、x /= y、x %= y、x &= y、x |= y、x ^= y、x <<= y、x >>= y、x >>>= y、x ??= y、=> | 指派和 Lambda 宣告 |
如需邏輯模式結合器優先順序的相關資訊,請參閱模式一文中的邏輯模式的優先順序和檢查順序一節。
運算子關聯性
當運算子具有相同的優先順序時,運算子的關聯性會決定作業的執行順序:
- 左向關聯運算子會依由左至右的順序進行評估。 除了指派運算子和 null 聯合運算子以外,所有二元運算子都是靠左關聯。 例如,
a + b - c
會判斷值為(a + b) - c
。 - 右向關聯運算子會依由右至左的順序進行評估。 指派運算子、null 聯合運算子、Lambda 和條件運算子
?:
是右向關聯。 例如,x = y = z
會判斷值為x = (y = z)
。
重要
在格式 P?.A0?.A1
的運算式中,如果 P
是 null
,則既不會評估 A0
也不會評估 A1
。 同樣地,在格式 P?.A0.A1
的運算式中,因為 P
是 null,所以不會評估 A0
,也不會評估 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# 語言規格的下列幾節: