C#運算子大全-各種運算子號的意思和作用

而立大叔發表於2012-07-23

一、[]
方括號 ([]) 用於陣列、索引器和屬性,也可用於指標。
1
、陣列型別是一種後跟 [] 的型別:

int[] fib = new int[100]; //建立一個有100元素的陣列
若要訪問陣列的一個元素,則用方括號括起所需元素的索引:
fib[0] = fib[1] = 1;
for( int i=2; i<100; ++i ) fib[i] = fib[i-1] + fib[i-2];// 
如果陣列索引超出範圍,則會引發異常。
2
、不能過載陣列索引運算子;但型別可以定義採用一個或多個引數的索引器和屬性。索引器引數括在方括號中(就像陣列索引一樣),但索引器引數可宣告為任何型別(這與陣列索引不同,陣列索引必須為整數)。
例如,.NET Framework 定義 Hashtable 型別,該型別將鍵和任意型別的值關聯在一起。
Collections.Hashtable h = new Collections.Hashtable();
h["a"] = 123; // note: using a string as the index
3
、方括號還用於指定屬性(C# 程式設計指南):
[attribute(AllowMultiple=true)]
public class Attr 
{
}
4
、可以使用方括號來指定指標索引:
unsafe fixed ( int* p = fib )   // p points to fib from earlier example
{
    p[0] = p[1] = 1;
    for( int i=2; i<100; ++i ) p[i] = p[i-1] + p[i-2];
}

二、()
除了用於指定表示式中的運算順序外,圓括號還用於指定強制轉換或型別轉換:
double x = 1234.7;
int a;
a = (int)x; // cast double to int

三、.
點運算子 (.) 用於成員訪問。點運算子指定型別或名稱空間的成員。例如,點運算子用於訪問.NET Framework 類庫中的特定方法:
System.Console.WriteLine("hello");

四、::
名稱空間別名限定符運算子 (::),用於查詢識別符號。它通常放置在兩個識別符號之間,例如:
global::System.Console.WriteLine("Hello World");
備註:
名稱空間別名限定符可以是 global。這將呼叫全域性名稱空間中的查詢,而不是在別名名稱空間中。

五、+
運算子既可作為一元運算子也可作為二元運算子。
備註:
一元 + 運算子是為所有數值型別預定義的。對數值型別進行一元 + 運算的結果就是運算元的值。
為數值型別和字串型別預定義了二元 + 運算子。對於數值型別,計算兩個運算元之和。當其中的一個運算元是字串型別或兩個運算元都是字串型別時,將運算元的字串表示形式串聯在一起。
委託型別也提供二元 + 運算子,該運算子執行委託串聯。

例項:
using System;
class MainClass
{
    static void Main() 
    {
        Console.WriteLine(+5);        // unary plus
        Console.WriteLine(5 + 5);     // addition
        Console.WriteLine(5 + .5);    // addition
        Console.WriteLine("5" + "5"); // string concatenation
        Console.WriteLine(5.0 + "5"); // string concatenation
        // note automatic conversion from double to string
    }
}

六、-
運算子既可作為一元運算子也可作為二元運算子。
一元 - 運算子是為所有數值型別預定義的。數值型別的一元 - 運算的結果是運算元的反數。
二元 - 運算子是為所有數值型別和列舉型別預定義的,其功能是從第一個運算元中減去第二個運算元。
委託型別也提供二元 - 運算子,該運算子執行委託移除。

示例:
using System;
class MainClass
{
    static void Main() 
    {
        int a = 5;
        Console.WriteLine(-a);
        Console.WriteLine(a - 1);
        Console.WriteLine(a - .5);
    }
}

七、*
乘法運算子 (*),用於計算運算元的積。另外還用作取消引用運算子,允許讀取和寫入指標。
備註:
所有數值型別都具有預定義的乘法運算子。
運算子還用來宣告指標型別和取消引用指標。該運算子只能在不安全的上下文中使用,通過unsafe 關鍵字的使用來表示,並且需要 /unsafe 編譯器選項。取消引用運算子也稱為間接定址運算子。

示例:
using System;
class MainClass
{
    static void Main() 
    {
        Console.WriteLine(5 * 2);
        Console.WriteLine(-.5 * .2);
        Console.WriteLine(-.5m * .2m); // decimal type
    }
}

八、/
除法運算子 (/) 用第二個運算元除第一個運算元。所有數值型別都具有預定義的除法運算子。
using System;
class MainClass
{
    static void Main() 
    {
        Console.WriteLine(-5/2);
        Console.WriteLine(-5.0/2);
    }
}

九、%
模數運算子 (%) 計算第二個運算元除第一個運算元後的餘數。所有數值型別都具有預定義的模數運算子。
using System;
class MainClass
{
    static void Main() 
    {
        Console.WriteLine(5 % 2);       // int
        Console.WriteLine(-5 % 2);      // int
        Console.WriteLine(5.0 % 2.2);   // double
        Console.WriteLine(5.0m % 2.2m); // decimal
        Console.WriteLine(-5.2 % 2.0); // double
    }
}

十、&
運算子既可作為一元運算子也可作為二元運算子。
備註:
一元 & 運算子返回運算元的地址(要求 unsafe 上下文)。
為整型和 bool 型別預定義了二進位制 運算子。對於整型,計算運算元的邏輯按位。對於 bool 運算元,計算運算元的邏輯;也就是說,當且僅當兩個運算元均為 true 時,結果才為 true 
運算子計算兩個運算子,與第一個運算元的值無關。例如:

int i = 0;
if (false & ++i == 1)
{
}

十一、|
二元 | 運算子是為整型和 bool 型別預定義的。對於整型,計算運算元的按位結果。對於 bool 運算元,計算運算元的邏輯結果;也就是說,當且僅當兩個運算元均為 false時,結果才為 false
using System;
class MainClass
{
    static void Main() 
    {
        Console.WriteLine(true | false); // logical or
        Console.WriteLine(false | false); // logical or
        Console.WriteLine("0x{0:x}", 0xf8 | 0x3f);   // bitwise or
    }
}

十二、^
二元 ^ 運算子是為整型和 bool 型別預定義的。對於整型,將計算運算元的按位異或。對於 bool 運算元,將計算運算元的邏輯異或;也就是說,當且僅當只有一個運算元為 true時,結果才為 true
using System;
class MainClass 
{
    static void Main() 
    {
        Console.WriteLine(true ^ false); // logical exclusive-or
        Console.WriteLine(false ^ false); // logical exclusive-or
        // Bitwise exclusive-or:
        Console.WriteLine("0x{0:x}", 0xf8 ^ 0x3f);
    }
}

十三、!
邏輯非運算子 (!) 是對運算元求反的一元運算子。為 bool 定義了該運算子,當且僅當運算元為false 時才返回 true
using System;
class MainClass 
{
    static void Main() 
{
        Console.WriteLine(!true);
        Console.WriteLine(!false);
    }
}

十四、~
運算子對運算元執行按位求補運算,其效果相當於反轉每一位。按位求補運算子是為intuintlong  ulong 型別預定義的。
using System;
class MainClass
{
    static void Main() 
    {
        int[] values = { 0, 0x111, 0xfffff, 0x8888, 0x22000022};
        foreach (int v in values)
        {
            Console.WriteLine("~0x{0:x8} = 0x{1:x8}", v, ~v);
        }
    }
}

十五、=
賦值運算子 (=) 將右運算元的值儲存在左運算元表示的儲存位置、屬性或索引器中,並將值作為結果返回。運算元的型別必須相同(或右邊的運算元必須可以隱式轉換為左邊運算元的型別)。
using System;
class MainClass
{
    static void Main()
    {
        double x;
        int i;
        i = 5; // int to int assignment
        x = i; // implicit conversion from int to double
        i = (int)x; // needs cast
        Console.WriteLine("i is {0}, x is {1}", i, x);
        object obj = i;
        Console.WriteLine("boxed value = {0}, type is {1}",
                  obj, obj.GetType());
        i = (int)obj;
        Console.WriteLine("unboxed: {0}", i);
    }
}

十六、<
所有數值和列舉型別都定義小於關係運算子 (<),如果第一個運算元小於第二個運算元,該運算子返回 true,否則返回 false
using System;
class MainClass
{
    static void Main() 
    {
        Console.WriteLine(1 < 1.1);
        Console.WriteLine(1.1 < 1.1);
    }
}

十七、>
所有數值型別和列舉型別都定義大於關係運算子 >,如果第一個運算元大於第二個運算元,它將返回 true,否則返回 false
using System;
class MainClass
{
    static void Main() 
    {
        Console.WriteLine(1.1 > 1);
        Console.WriteLine(1.1 > 1.1);
    }
}

十八、?:
條件運算子 (?:) 根據布林型表示式的值返回兩個值中的一個。條件運算子的格式如下 
condition ? first_expression : second_expression;
備註:

如果條件為 true,則計算第一表示式並以它的計算結果為準;如果為 false,則計算第二表示式並以它的計算結果為準。只計算兩個表示式中的一個。
使用條件運算子,可以更簡潔、雅觀地表達那些否則可能要求 if-else 結構的計算。例如,為在sin 函式的計算中避免被零除,可編寫為
if(x != 0.0) s = Math.Sin(x)/x; else s = 1.0;
或使用條件運算子,
s = x != 0.0 ? Math.Sin(x)/x : 1.0;

十九、++
增量運算子 (++) 將運算元加 1。增量運算子可以出現在運算元之前或之後:
備註:
第一種形式是字首增量操作。該操作的結果是運算元加 1 之後的值。
第二種形式是字尾增量操作。該運算的結果是運算元增加之前的值。
數值型別和列舉型別具有預定義的增量運算子。使用者定義的型別可過載 ++ 運算子。在列舉時通常允許整型運算。

二十、--
減量運算子 (--) 將運算元減 1。減量運算子可以出現在運算元之前或之後:--variable variable--。第一種形式是字首減量操作。該運算的結果是運算元減小之後的值。第二種形式是字尾減量操作。該運算的結果是運算元減小之前的值。
備註:
數值型別和列舉型別具有預定義的增量運算子。
使用者定義的型別可過載 -- 運算子(請參見運算子)。在列舉時通常允許整型運算。

二十一、&&
條件運算子 (&&) 執行其 bool 運算元的邏輯運算,但僅在必要時才計算第二個運算元。
備註:
操作
x && y
對應於操作
x & y
不同的是,如果 x  false,則不計算 y(因為不論 y 為何值,操作的結果都為false)。這被稱作為短路計算。
不能過載條件運算子,但常規邏輯運算子和運算子 true  false 的過載,在某些限制條件下也被視為條件邏輯運算子的過載。

 

二十二、||
條件運算子 (||) 執行 bool 運算元的邏輯運算,但僅在必要時才計算第二個運算元。
備註:
操作
x || y
對應於操作
x | y
不同的是,如果 x  true,則不計算 y(因為不論 y 為何值,操作的結果都為true)。這被稱作為短路計算。
不能過載條件運算子,但規則邏輯運算子和運算子 true  false 的過載,在某些限制條件下也被視為條件邏輯運算子的過載。

 

二十三、<<
左移運算子 (<<) 將第一個運算元向左移動第二個運算元指定的位數。第二個運算元的型別必須是 int
備註:
如果第一個運算元是 int  uint32 位數),則移位數由第二個運算元的低 5 位給出。
如果第一個運算元是 long  ulong64 位數),則移位數由第二個運算元的低 6 位給出。
第一個運算元的高序位被放棄,低序空位用 0 填充。移位操作從不導致溢位。
使用者定義的型別可過載 << 運算子(請參見 operator);第一個運算元的型別必須為使用者定義的型別,第二個運算元的型別必須為 int。過載二元運算子時,也會隱式過載相應的賦值運算子(如果有)。

二十四、>>
右移運算子 (>>) 將第一個運算元向右移動第二個運算元所指定的位數。
備註:
如果第一個運算元為 int  uint32 位數),則移位數由第二個運算元的低五位給出(第二個運算元 & 0x1f)。
如果第一個運算元為 long  ulong64 位數),則移位數由第二個運算元的低六位給出(第二個運算元 & 0x3f)。
如果第一個運算元為 int  long,則右移位是算術移位(高序空位設定為符號位)。如果第一個運算元為 uint  ulong 型別,則右移位是邏輯移位(高位填充 0)。
使用者定義的型別可過載 >> 運算子;第一個運算元的型別必須為使用者定義的型別,第二個運算元的型別必須為 int。有關更多資訊,請參見 operator。過載二元運算子時,也會隱式過載相應的賦值運算子(如果有)。

二十五、==
對於預定義的值型別,如果運算元的值相等,則相等運算子 (==) 返回 true,否則返回 false。對於 string 以外的引用型別,如果兩個運算元引用同一個物件,則 == 返回 true。對於string 型別,== 比較字串的值。
備註:
使用者定義的值型別可過載 == 運算子(請參見 operator)。使用者定義的引用型別也可過載 == 運算子,儘管在預設情況下,無論對於預定義的引用型別還是使用者定義的引用型別,== 的行為都與上面描述的相同。如果過載 ==,則還必須過載 !=。在列舉時通常允許整型運算。

 

二十六、!=
如果運算元相等,則不等運算子 (!=) 返回 false,否則,返回 true。為所有型別(包括字串和物件)預定義了不等運算子。使用者定義的型別可過載 != 運算子。
備註:
對於預定義的值型別,如果運算元的值不同,則不等運算子 (!=) 返回 true,否則,返回false。對於 string 以外的引用型別,如果兩個運算元引用不同的物件,則 != 返回 true。對於 string 型別,!= 比較字串的值。
使用者定義的值型別可過載 != 運算子(請參見 operator)。使用者定義的引用型別也可過載 != 運算子,儘管在預設情況下,無論對於預定義的引用型別還是使用者定義的引用型別,!= 的行為都與上面描述的相同。如果過載 !=,則還必須過載 ==。在列舉時通常允許整型運算。

 

二十七、<=
所有數值和列舉型別都定義了小於等於關係運算子 (<=),如果第一個運算元小於或等於第二個運算元,則該運算子將返回 true,否則返回 false

二十八、>=
所有數值型別和列舉型別都定義大於等於關係運算子 >=,如果第一個運算元大於或等於第二個運算元,該運算子將返回 true,否則返回 false

二十九、+=
加法賦值運算子。
備註:
使用 += 賦值運算子的表示式,例如
x += y
等效於
x = x + y
不同的是 x 只計算一次。運算子的含義取決於 x  y 的型別(例如,對於數值運算元,其含義為相加;對於字串運算元,其含義為串聯)。
不能直接過載 += 運算子,但使用者定義的型別可以過載 + 運算子(請參見 operator)。

 

三十、-=
減法賦值運算子。
備註:
使用 -= 賦值運算子的表示式,如
x -= y
等效於
x = x - y
不同的是 x 只計算一次。運算子的含義取決於 x  y 的型別(例如,對於數值運算元,其含義為相減;對於委託運算元,其含義為移除)。
不能直接過載 -= 運算子,但使用者定義的型別可過載 - 運算子(請參見 operator)。

三十一、*=
二元乘法賦值運算子。
備註:
使用 *= 賦值運算子的表示式,如
x *= y
等效於
x = x * y
不同的是 x 只計算一次。為數值型別預定義了 * 運算子以執行乘法操作。
不能直接過載 *= 運算子,但使用者定義的型別可過載 * 運算子(請參見 operator)。

三十二、/=
除法賦值運算子。
備註:
使用 /= 賦值運算子的表示式,如
x /= y
等效於
x = x / y
不同的是 x 只計算一次。為數值型別預定義了 / 運算子以執行除法操作。
不能直接過載 /= 運算子,但使用者定義的型別可過載 / 運算子(請參見 operator)。對於所有複合賦值運算子,隱式過載二元運算子會過載等效的複合賦值。

三十三、%=
模組賦值運算子。
備註:
使用 %= 賦值運算子的表示式,如
x %= y
等效於
x = x % y
不同的是 x 只計算一次。為數值型別預定義了 % 運算子,以計算相除後的餘數。
不能直接過載 %= 運算子,但使用者定義的型別可過載 % 運算子(請參見運算子(C# 參考))。

三十四、&=
賦值運算子。
備註:
使用 &= 賦值運算子的表示式,如
x &= y
等效於
x = x & y
不同的是 x 只計算一次。運算子對整數運算元執行按位邏輯運算,對 bool 運算元執行邏輯運算。
不能直接過載 &= 運算子,但使用者定義的型別可過載二元 & 運算子(請參見 operator)。

三十五、|=
賦值運算子。
備註:
使用 |= 賦值運算子的表示式,例如
x |= y
等效於
x = x | y
不同的是 x 只計算一次。運算子對整型運算元執行按位邏輯運算,對布林運算元執行邏輯運算。
不能直接過載 |= 運算子,但使用者定義的型別可以過載 | 運算子(請參見 operator)。

三十六、^=
異或賦值運算子。
備註:
下列形式的表示式
x ^= y
按如下規則計算:
x = x ^ y
不同的是 x 只計算一次。運算子對整數運算元執行按位異或運算,對 bool 運算元執行邏輯異或運算。
不能直接過載 ^= 運算子,但使用者定義的型別可過載 ! 運算子(請參見 operator)。

三十七、<<=
左移賦值運算子。
備註:
下列形式的表示式
x <<= y
按如下規則計算:
x = x << y
不同的是 x 只計算一次。<< 運算子將 x 向左移動 y 指定的位數。
不能直接過載 <<= 運算子,但使用者定義的型別可過載 << 運算子(請參見 operator)。

三十八、>>=
右移賦值運算子。
備註:
下列形式的表示式
x >>= y
按如下規則計算:
x = x >> y
不同的是 x 只計算一次。>> 運算子根據 y 指定的量對 x 進行右移位。
不能直接過載 >>= 運算子,但使用者定義的型別可過載 >> 運算子(請參見 operator)。

三十九、->
-> 運算子將指標取消引用與成員訪問組合在一起。
備註:
以下形式的表示式 
x->y
(其中 x  T* 型別的指標, T 的成員)等效於

(*x).y
-> 
運算子只能在非託管程式碼中使用。
不能過載 -> 運算子。

 

四十、??
如果 ?? 運算子的左運算元非空,該運算子將返回左運算元,否則返回右運算元。
備註:
可空型別可以包含值,或者可以是未定義的。?? 運算子定義當可空型別分配給非可空型別時返回的預設值。如果在將可空型別分配給非可空型別時不使用 ?? 運算子,將生成編譯時錯誤。如果使用強制轉換,並且當前未定義可空型別,將發生 InvalidOperationException 異常。 
示例

相關文章