天天看點

【C#學習】運算符

C# 提供了許多運算符,這些運算符是指定要在表達式中執行哪些操作(數學、索引、函數調用等等)的符号。 可以重載許多應用于使用者定義類型的運算符,進而更改其含義。

對整數類型執行的運算(如 

==

!=

<

>

&

|

)通常也可對枚舉 (

enum

) 類型執行。

以下章節按最高優先級到最低優先級的順序列示 C# 運算符。 各章節内運算符的優先級相同。

主要運算符

以下是具有最高優先級的運算符。 請注意,你可以單擊運算符轉到包含示例的詳細頁面。

x.y:成員通路。

x?.y:null 條件成員通路。 如果左操作數為 

null

,則傳回 

null

x?[y]:null 條件索引通路。 如果左操作數為 

null

,則傳回 

null

f(x):函數調用。

a[x]:聚合對象索引。

x++:字尾遞增。 先傳回 x 值,然後用加 1(通常加整數 1)後的 x 值更新存儲位置。

x--:字尾遞減。 先傳回 x 值,然後用減 1(通常減整數 1)後的 x 值更新存儲位置。

new:類型執行個體化。

typeof:傳回表示操作數的 System.Type 對象。

checked:對整數運算啟用溢出檢查。

unchecked:對整數運算禁用溢出檢查。 這是預設的編譯器行為。

default(T):傳回類型 T 的預設初始值,引用類型的預設初始值為 

null

,數值類型的預設初始值為 0,結構類型成員的預設初始填充值為 0/

null

delegate:聲明并傳回委托執行個體。

sizeof:傳回類型操作數的大小(以位元組為機關)。

->:指針取消引用與成員通路相結合。

一進制運算符

這些運算符的優先級比下一章節高,比上一章節低。 請注意,你可以單擊運算符轉到包含示例的詳細頁面。

+x:傳回 x 的值。

-x:數值取反。

!x:邏輯取反。

~x:按位求補。

++x:字首遞增。 先用加 1(通常加整數 1)後的 x 值更新存儲位置,然後傳回 x 值。

--x:字首遞減。 先用減 1(通常減整數 1)後的 x 值更新存儲位置,然後傳回 x 值。

(T)x:類型顯式轉換。

await:等待 

Task

&x:位址。

*x:取消引用。

乘法運算符

這些運算符的優先級比下一章節高,比上一章節低。 請注意,你可以單擊運算符轉到包含示例的詳細頁面。

x * y:乘法。

x / y:除法。 如果操作數均為整數,則結果為整數,舍去小數(例如,

-7 / 2 is -3

)。

x % y:取模。 如果操作數均為整數,則傳回 x 除以 y 後的餘數。 如果 

q = x / y

 且 

r = x % y

,則 

x = q * y + r

相加運算符

這些運算符的優先級比下一章節高,比上一章節低。 請注意,你可以單擊運算符轉到包含示例的詳細頁面。

x + y:加法。

x:y:減法。

移位運算符

這些運算符的優先級比下一章節高,比上一章節低。 請注意,你可以單擊運算符轉到包含示例的詳細頁面。

x << y:左移位,右側用 0 填充。

x >> y:右移位。 如果左操作數是 

int

 或 

long

,則左位數補符号位。 如果左操作數是 

uint

 或 

ulong

,則左位數補零。

關系和類型測試運算符

這些運算符的優先級比下一章節高,比上一章節低。 請注意,你可以單擊運算符轉到包含示例的詳細頁面。

x < y:小于(如果 x 小于 y,則為 true)。

x > y:大于(如果 x 大于 y,則為 true)。

x <= y:小于或等于。

x >= y:大于或等于。

is:類型相容性。 如果求值後的左操作數可以轉換為右操作數中指定的類型(靜态類型),則傳回 true。

as:類型轉換。 傳回左操作數并轉換為右操作數中指定的類型(靜态類型),但 

as

 傳回 

null

,其中 

(T)x

 會引發異常。

相等運算符

這些運算符的優先級比下一章節高,比上一章節低。 請注意,你可以單擊運算符轉到包含示例的詳細頁面。

x == y:相等。 預設情況下,對于 

string

 以外的引用類型,此運算符傳回引用相等(辨別測試)。 但是,類型可以重載 

==

,是以,如果你想測試辨別,最好對 

object

 使用 

ReferenceEquals

 方法。

x != y:不相等。 請參閱有關 

==

 的注釋。 如果某個類型重載 

==

,則它必須重載 

!=

邏輯 AND 運算符

此運算符的優先級比下一章節高,比上一章節低。 請注意,你可以單擊該運算符轉到包含示例的詳細頁面。

x & y:邏輯或位 AND。 與整數類型一起使用,并且通常允許 

enum

 類型。

邏輯 XOR 運算符

此運算符的優先級比下一章節高,比上一章節低。 請注意,你可以單擊該運算符轉到包含示例的詳細頁面。

x ^ y:邏輯或位 XOR。 通常可以将此運算符與整數類型和 

enum

 類型一起使用。

邏輯 OR 運算符

此運算符的優先級比下一章節高,比上一章節低。 請注意,你可以單擊該運算符轉到包含示例的詳細頁面。

x | y:邏輯或位 OR。 與整數類型一起使用,并且通常允許 

enum

 類型。

條件 AND 運算符

此運算符的優先級比下一章節高,比上一章節低。 請注意,你可以單擊該運算符轉到包含示例的詳細頁面。

x && y:邏輯 AND。 如果第一個操作數為 false,則 C# 不對第二個操作數求值。

條件 OR 運算符

此運算符的優先級比下一章節高,比上一章節低。 請注意,你可以單擊該運算符轉到包含示例的詳細頁面。

x || y:邏輯 OR。 如果第一個操作數為 true,則 C# 不對第二個操作數求值。

Null 合并運算符

此運算符的優先級比下一章節高,比上一章節低。 請注意,你可以單擊該運算符轉到包含示例的詳細頁面。

x ?? y:如果不為 

null

,則傳回 

x

;否則傳回 

y

條件運算符

此運算符的優先級比下一章節高,比上一章節低。 請注意,你可以單擊該運算符轉到包含示例的詳細頁面。

t ? x : y:如果測試 

t

 為 true,則計算并傳回 

x

;否則,計算并傳回 

y

指派和 Lambda 運算符

這些運算符的優先級比下一章節高,比上一章節低。 請注意,你可以單擊運算符轉到包含示例的詳細頁面。

x = y:指派。

x += y:遞增。 

x

 值加 

y

 值,結果存儲在 

x

 中,并傳回新值。 如果 

x

 指定 

event

,則 

y

 必須是 C# 作為事件處理程式添加的相應函數。

x -= y:遞減。 

x

 值減 

y

 值,結果存儲在 

x

 中,并傳回新值。 如果 

x

 指定 

event

,則 

y

 必須是 C# 作為事件處理程式删除的相應函數

x *= y:乘法指派。 

x

 值乘以 

y

 值,結果存儲在 

x

 中,并傳回新值。

x /= y:除法指派。 

x

 值除以 

y

 值,結果存儲在 

x

 中,并傳回新值。

x %= y:取模指派。 

x

 值除以 

y

 值,餘數存儲在 

x

 中,并傳回新值。

x &= y:AND 指派。 

y

 值和 

x

 值相與,結果存儲在 

x

 中,并傳回新值。

x |= y:OR 指派。 

y

 值和 

x

 值相或,結果存儲在 

x

 中,并傳回新值。

x ^= y:XOR 指派。 

y

 值和 

x

 值相異或,結果存儲在 

x

 中,并傳回新值。

x <<= y:左移指派。 将 

x

 值向左移動 

y

 位,結果存儲在 

x

 中,并傳回新值。

x >>= y:右移指派。 将 

x

 值向右移動 

y

 位,結果存儲在 

x

 中,并傳回新值。

=>:lambda 聲明。

算術溢出

算術運算符(+、-、*、/)的計算結果可能會超出所涉數值類型的可取值範圍。 詳細資訊應參考特定運算符的相關章節,而一般情況下:

  • 整數算術溢出或者引發 OverflowException,或者放棄結果的最高有效位。 整數被零除總是引發 @System.DivideByZeroException。

    發生整數溢出時,具體影響視執行上下文而定,上下文可為 checked 或 unchecked。 在 checked 上下文中引發 OverflowException。 在 unchecked 上下文中,放棄結果的最高有效位并繼續執行。 是以,C# 讓你有機會選擇處理或忽略溢出。 預設情況下,算術運算發生在 unchecked 上下文中。

    除算術運算以外,整型類型之間的顯式轉換也會導緻溢出(例如,将 long 顯式轉換成 int),并受到 checked 或 unchecked 執行的限制。 但是,位運算符和移位運算符永遠不會導緻溢出。

  • 浮點算術溢出或被零除從不引發異常,因為浮點類型基于 IEEE 754,是以可以表示無窮大和 NaN(非數值)。
  • 小數算術溢出總是引發 OverflowException。 小數被零除總是引發 DivideByZeroException。
c#