2014年1月1日 星期三

C# Operators 運算符號大全

+運算符號
+ 運算符既可作為一元運算符也可作為二元運算符。
備註:
一元 + 運算符是為所有數值類型預定義的。對數值類型進行一元 + 運算的結果就是操作數的值。
為數值類型和字符串類型預定義了二元 + 運算符。對於數值類型,+ 計算兩個操作數之和。當其中的一個操作數是字符串類型或兩個操作數都是字符串類型時,+ 將操作數的字符串表示形式串聯在一起。
委托類型也提供二元 + 運算符,該運算符執行委托串聯。
class MainClass
{
    static void Main()
    {
        Console.WriteLine(+5);
        Console.WriteLine(5 + 5);
        Console.WriteLine(5 + .5);
        Console.WriteLine("5" + "5");
        Console.WriteLine(5.0 + "5");
    }
}

-運算符號
- 運算符既可作為一元運算符也可作為二元運算符。
一元 - 運算符是為所有數值類型預定義的。數值類型的一元 - 運算的結果是操作數的反數。
二元 - 運算符是為所有數值類型和枚舉類型預定義的,其功能是從第一個操作數中減去第二個操作數。
委托類型也提供二元 - 運算符,該運算符執行委托移除。
class MainClass
{
    static void Main()
    {
        int a = 5;
        Console.WriteLine(-a);
        Console.WriteLine(a - 1);
        Console.WriteLine(a - .5);
    }
}

*運算符號
乘法運算符 (*),用於計算操作數的積。另外還用作取消引用運算符,允許讀取和寫入指針。
備註:
所有數值類型都具有預定義的乘法運算符。
* 運算符還用來聲明指針類型和取消引用指針。該運算符只能在不安全的上下文中使用,通過 unsafe 關鍵字的使用來表示,並且需要 /unsafe 編譯器選項。取消引用運算符也稱為間接尋址運算符。
class MainClass
{
    static void Main()
    {
        Console.WriteLine(5 * 2);
        Console.WriteLine(-.5 * .2);
        Console.WriteLine(-.5m * .2m);
    }
}

/運算符號
除法運算符 (/) 用第二個操作數除第一個操作數。所有數值類型都具有預定義的除法運算符。
class MainClass
{
    static void Main()
    {
        Console.WriteLine(-5/2);
        Console.WriteLine(-5.0/2);
    }
}

%運算符號
模數運算符 (%) 計算第二個操作數除第一個操作數後的餘數。所有數值類型都具有預定義的模數運算符。
class MainClass
{
    static void Main()
    {
        Console.WriteLine(5 % 2);
        Console.WriteLine(-5 % 2);
        Console.WriteLine(5.0 % 2.2);
        Console.WriteLine(5.0m % 2.2m);
        Console.WriteLine(-5.2 % 2.0);
    }
}

&運算符號
& 運算符既可作為一元運算符也可作為二元運算符。
備註:
一元 & 運算符返回操作數的地址(要求 unsafe 上下文)。
為整型和 bool 類型預定義了二進制 & 運算符。對於整型,& 計算操作數的邏輯按位“與”。對於 bool 操作數,& 計算操作數的邏輯“與”;也就是說,當且僅當兩個操作數均為 true 時,結果才為 true。
& 運算符計算兩個運算符,與第一個操作數的值無關。例如:
int i = 0;
if (false & ++i == 1)
{
}

|運算符號
二元 | 運算符是為整型和 bool 類型預定義的。對於整型,| 計算操作數的按位“或”結果。對於 bool 操作數,| 計算操作數的邏輯“或”結果;也就是說,當且僅當兩個操作數均為 false 時,結果才為 false。
class MainClass
{
    static void Main()
    {
        Console.WriteLine(true | false);
        Console.WriteLine(false | false);
        Console.WriteLine("0x{0:x}", 0xf8 | 0x3f);
    }
}

^運算符號
二元 ^ 運算符是為整型和 bool 類型預定義的。對於整型,^ 將計算操作數的按位“異或”。對於 bool 操作數,^ 將計算操作數的邏輯“異或”;也就是說,當且僅當只有一個操作數為 true 時,結果才為 true。
class MainClass
{
    static void Main()
    {
        Console.WriteLine(true ^ false);
        Console.WriteLine(false ^ false);
        Console.WriteLine("0x{0:x}", 0xf8 ^ 0x3f);
    }
}

!運算符號
邏輯非運算符 (!) 是對操作數求反的一元運算符。為 bool 定義了該運算符,當且僅當操作數為 false 時才返回 true。
class MainClass
{
    static void Main()
    {
        Console.WriteLine(!true);
        Console.WriteLine(!false);
    }
}

~運算符號
~ 運算符對操作數執行按位求補運算,其效果相當於反轉每一位。按位求補運算符是為 int、uint、long 和 ulong 類型預定義的。
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);
        }
    }
}

?:運算符號
條件運算符 (?:) 根據布爾型表達式的值返回兩個值中的一個。條件運算符的格式如下
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;

==運算符號
對於預定義的值類型,如果操作數的值相等,則相等運算符 (==) 返回 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)。

++運算符號
增量運算符 (++) 將操作數加 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 或 uint(32 位數),則移位數由第二個操作數的低 5 位給出。
如果第一個操作數是 long 或 ulong(64 位數),則移位數由第二個操作數的低 6 位給出。
第一個操作數的高序位被放棄,低序空位用 0 填充。移位操作從不導致溢出。
用戶定義的類型可重載 << 運算符(請參見 operator);第一個操作數的類型必須為用戶定義的類型,第二個操作數的類型必須為 int。重載二元運算符時,也會隱式重載相應的賦值運算符(如果有)。

>>運算符號
右移運算符 (>>) 將第一個操作數向右移動第二個操作數所指定的位數。
備註:
如果第一個操作數為 int 或 uint(32 位數),則移位數由第二個操作數的低五位給出(第二個操作數 & 0x1f)。
如果第一個操作數為 long 或 ulong(64 位數),則移位數由第二個操作數的低六位給出(第二個操作數 & 0x3f)。
如果第一個操作數為 int 或 long,則右移位是算術移位(高序空位設置為符號位)。如果第一個操作數為 uint 或 ulong 類型,則右移位是邏輯移位(高位填充 0)。
用戶定義的類型可重載 >> 運算符;第一個操作數的類型必須為用戶定義的類型,第二個操作數的類型必須為 int。有關更多信息,請參見 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* 類型的指針,y 為 T 的成員)等效於
(*x).y
-> 運算符只能在非托管代碼中使用。
不能重載 -> 運算符。

??運算符號
如果 ?? 運算符的左操作數非空,該運算符將返回左操作數,否則返回右操作數。
備註:
可空類型可以包含值,或者可以是未定義的。?? 運算符定義當可空類型分配給非可空類型時返回的默認值。如果在將可空類型分配給非可空類型時不使用 ?? 運算符,將生成編譯時錯誤。如果使用強制轉換,並且當前未定義可空類型,將發生 InvalidOperationException 異常。
class MainClass
{
    static int? GetNullableInt()
    {
        return null;
    }

    static string GetStringValue()
    {
        return null;
    }

    static void Main()
    {
        int? x = null;
        int y = x ?? -1;
        int i = GetNullableInt() ?? default(int);

        string s = GetStringValue();
        Console.WriteLine(s ?? "Unspecified");
    }
}

=運算符號
賦值運算符 (=) 將右操作數的值存儲在左操作數表示的存儲位置、屬性或索引器中,並將值作為結果返回。操作數的類型必須相同,或右邊的操作數必須可以隱式轉換為左邊操作數的類型。
class MainClass
{
    static void Main()
    {
        double x;
        int i;
        i = 5;
        x = i;
        i = (int)x;
        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。
class MainClass
{
    static void Main()
    {
        Console.WriteLine(1 < 1.1);
        Console.WriteLine(1.1 < 1.1);
    }
}

>運算符號
所有數值類型和枚舉類型都定義“大於”關系運算符 >,如果第一個操作數大於第二個操作數,它將返回 true,否則返回 false。
class MainClass
{
    static void Main()
    {
        Console.WriteLine(1.1 > 1);
        Console.WriteLine(1.1 > 1.1);
    }
}

[]運算符號
方括號 ([]) 用於數組、索引器和屬性,也可用於指針。

  • 數組類型是一種後跟 [] 的類型:
創建一個有100元素的數組
int[] fib = new int[100];  
若要訪問數組的一個元素,則用方括號括起所需元素的索引:
fib[0] = fib[1] = 1; 
如果數組索引超出範圍,則會引發異常。
for( int i=2; i<100; ++i ) fib[i] = fib[i-1] + fib[i-2];

  • 不能重載數組索引運算符;但類型可以定義采用一個或多個參數的索引器和屬性。索引器參數括在方括號中(就像數組索引一樣),但索引器參數可聲明為任何類型(這與數組索引不同,數組索引必須為整數)。
例如.NET Framework定義 Hashtable類型,該類型將鍵和任意類型的值關聯在一起。
Collections.Hashtable h = new Collections.Hashtable();
h["a"] = 123;
  • 方括號還用於指定屬性:



[attribute(AllowMultiple=true)]
public class Attr
{
}

  • 可以使用方括號來指定指針索引:
unsafe fixed ( int* p = fib )
{
    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;

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

::運算符號
命名空間別名限定符運算符 (::),用於查找標識符。它通常放置在兩個標識符之間,例如:
global::System.Console.WriteLine("Hello World");
命名空間別名限定符可以是 global。這會調用全域命名空間中的查尋,而不是在別名命名空間中。

-雲遊山水為知已逍遙一生而忘齡- 電腦神手

沒有留言:

張貼留言