運算子 (C# 程式設計手冊)

在 C# 中,運算子 是套用至運算式或陳述式中一或多個 運算元的程式項目。 使用一個運算元的運算子稱為「一元」(Unary) 運算子,例如遞增運算子 (++) 或 new。 使用兩個運算元的運算子則稱為「二元」(Binary) 運算子,例如算術運算子 (+、-、* 和 /)。 還有一種運算子稱為條件運算子 (?:),它需要三個運算元,是 C# 中唯一的三元運算子。

下列 C# 陳述式包含一個一元運算子和一個運算元。 遞增運算子 ++ 會修改運算元 y 的值。

y++;

下列 C# 陳述式包含兩個二元運算子,這兩個運算子各有兩個運算元。 指派運算子 = 的運算元為整數變數 y 和運算式 2 + 3。 運算式 2 + 3 本身包含加法運算子和兩個運算元 2 和 3。

y = 2 + 3;

運算子、評估和運算子優先權

運算元可以是任何大小的有效運算式,也可以由任何數目的其他運算式所組成。 在包含多個運算子的運算式中,套用運算子的順序取決於運算子優先權、關聯性,以及括號。

每個運算子都有已定義的優先權。 在包含具有不同優先權級別的多個運算子的運算式中,運算子的優先權決定評估運算子的順序。 例如,下列陳述式會將 3 指派給 n1。

n1 = 11 - 2 * 4;

因為乘法的優先順序高於減法,所以首先會執行乘法。

下表根據運算子所執行的運算類型,將運算子分為幾類。 每個分類都是依照優先順序列出。

主要運算子

運算式

描述

x.y

成員存取 (Member Access)

f(x)

方法和委派叫用

a[x]

陣列和索引子存取

x++

後置遞增

x--

後置遞減

new T(...)

建立物件和委派

new T(...){...}

使用初始設定式建立物件。 請參閱物件和集合初始設定式 (C# 程式設計手冊)

new {...}

匿名物件初始設定式。 請參閱匿名型別 (C# 程式設計手冊)

new T[...]

建立陣列 請參閱陣列 (C# 程式設計手冊)

typeof(T)

取得 T 的 System.Type 物件

checked(x)

在核取的內容中評估運算式

unchecked(x)

在未核取的內容中評估運算式

default (T)

取得型別 T 的預設值

delegate {}

匿名函式 (匿名方法)

一元運算子

運算式

描述

+x

識別

-x

否定

!x

邏輯否定

~x

位元否定

++x

前置遞增

--x

前置遞減

(T)x

x 明確轉換成型別 T

乘法類運算子

運算式

描述

*

乘法

/

除法

%

餘數

加法類運算子

運算式

描述

x + y

加法、字串串連、委派組合

x - y

減法、委派移除

移位運算子

運算式

描述

x << y

左移

x >> y

右移

關係和型別運算子

運算式

描述

x < y

小於

x > y

大於

x <= y

小於或等於

x >= y

大於或等於

x is T

如果 x 為 T 則傳回 true,否則傳回 false

x as T

傳回型別 T 的 x,如果 x 不是 T 則傳回 null

等號比較運算子

運算式

描述

x == y

等於

x != y

不相等

邏輯、條件和 Null 運算子

分類

運算式

描述

邏輯 AND

x & y

整數位元 AND、布林邏輯 AND

邏輯 XOR

x ^ y

整數位元 XOR、布林邏輯 XOR

邏輯 OR

x| y

整數位元 OR、布林邏輯 OR

條件式 AND

x && y

只有在 x 為 true 時評估 y

條件式 OR

x || y

只有在 x 為 false 時評估 y

Null 結合

x ?? y

如果 x 為 null,評估 y,否則評估 x

條件式

x ?: y : z

如果 x 為 true 則評估 y;如果 x 為 false 則評估 z

指派和匿名運算子

運算式

描述

=

指派

x op= y

複合指派。 支援下列運算子:+=, -=, *=, /=, %=, &=, |=, !=, <<=, >>=

(T x) => y

匿名函式 (Lambda 運算式)

順序關聯性

當有兩個或更多優先順序相同的運算子出現在同一個運算式中時,會根據順序關聯性評估這些運算子。 左向關聯運算子會以由左到右的順序進行評估。 例如,x * y / z 會被評估為 (x * y) / z。 右向關聯運算子會以由右到左的順序進行評估。 例如,指派運算子是右向關聯。 如果不是,下列程式碼將造成錯誤。

int a, b, c;
c = 1;
// The following two lines are equivalent.
a = b = c;
a = (b = c);

// The following line, which forces left associativity, causes an error.
//(a = b) = c;

指派運算子和三元運算子 (?:) 是右向關聯的。 所有其他二元運算子都是左向關聯的。

不論運算式中的運算子是左關聯還是右關聯,都會由左至右,先行評估每個運算式的運算元。 下列範例說明運算子和運算元的評估順序。

Statement

評估的順序

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, +, =

a = b - c + d

a, b, c, -, d, +, =

a += b -= c

a, b, c, -=, +=

新增括弧

您可以使用括號變更運算子優先順序和關聯性所強制的順序。 例如,2 + 3 * 2正常會評估為 8,這是因為乘法運算子的優先順序較加法運算子為高。 但是,如果您將運算式編寫為(2 + 3) * 2,會在計算乘法之前計算加法,結果會是 10。 下列範例說明括號括住之運算式中的評估順序。 如之前的範例,會在套用運算子之前評估運算元。

Statement

評估的順序

a = (b + c) * d

a, b, c, +, d, *, =

a = b - (c + d)

a, b, c, d, +, -, =

a = (b + c) * (d - e)

a, b, c, +, d, e, -, *, =

運算子多載

您可以為自訂類別和結構變更運算子的行為。 這個程序稱為「運算子多載」(Operator Overloading)。 如需詳細資訊,請參閱可多載的運算子 (C# 程式設計手冊)

相關章節

如需詳細資訊,請參閱 運算子關鍵字 (C# 參考)C# 運算子

請參閱

參考

陳述式、運算式和運算子 (C# 程式設計手冊)

概念

C# 程式設計手冊