C# 運算子和運算式 (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];
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.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 | 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)
。
使用括弧來變更由運算子關聯性強制執行的評估順序:
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# 語言規格的下列幾節: