通常将运算符分为3类:一元运算符、二元运算符、三元运算符。他们对应的操作数分别是1个、2个和3个。

         一元运算符主要用于指定负值(decimal a = -2234234234234234.72M)

 

         二元运算符要求两个操作数,分别称为左操作数和右操作数。二元运算符还要求代码对结果进行赋值,以避免丢失结果值。二元运算符分为加(+)、减(-)、乘(*)、除(/)、和取余(%,有时也称为取模运算符)。

         二元运算符优先级如下:

         1).*、/和%                  2).+和-               3).=

         如果将二元运算符中的加法运算符用于字符串,便起到一个拼接字符串的作用。

         在算术运算中使用字符

         虽然char类型存储的是字符而不是数字,但它是一个整数类型。它可以和其他整数类型一起参与算术运算。然而,如何解释char类型的值,并不是基于存储在其中的字符,而是基于它的基础值。例如,数字3包含一个Unicode值0×33(十六进制),换算成十进制值是51。数字4包含Unicode值0×34,或者十进制的52。

         浮点类型造成非预期的不相等

         浮点类型float和double有一些特殊性,比如它们处理精度的方式。

         一个float具有7位精度,能容纳值1234567和0.1234567。然而,如果将这两个float值加到一起,结果会被取整为1234567,因为小数部分超过了一个float能够容纳的7位有效数字。这种类型的取整有时是致命的,尤其是在执行重复性计算或者检查相等性的时候。

         在比较两个值是否相等的时候,浮点类型的不准确性可能造成非常严重的后果。有的时候,本来应该相等的值被错误地判断为不相等。

         浮点类型还有其他一些特殊性。例如,一个整数除以零,理论上来说应造成一个错误。对于精确的数据类型来说,这一点是成立的。然后,float和double允许一些特殊的值。浮点数除以零,显示“非数字”

float n = 0f;         System.Console.WriteLine( n / 0 );    输出: 非数字

         圆括号运算符

         圆括号运算符允许组合操作数和运算符,使它们能一起求值。这一点相当重要,因为它提供了超越默认优先级的途径。开发者应主动使用圆括号来增强代码的可读性,显示地消除表达式的歧义,而不是依赖运算符的优先级。

         递增和递减运算符

         C#提供了特殊的运算符来实现计数器的递增和递减。递增运算符(++)每次使一个变量递增1。递减运算符(--)每次使一个变量递减1。

         对比下前缀和后缀递增运算符

        

class IncrementExample
         {
            public static void Main()
            {
                    int x;
                    x = 1;
                    System.Console.WriteLine("{0},{1},{2}",x++,x++,x);
                    System.Console.WriteLine("{0}.{1},{2}",++x,++x,x);
             }
          }
输出: 
1,2,3
4,5,5

         由此可以看出,前缀递增/递减运算符返回的是对操作数进行递增/递减之后的结果,而后缀递增/递减运算符返回的是对操作数进行递增/递减之前的结果.

         线程安全的递增和递减

         使用由System.Threading.Interlocked类提供的线程安全的方法Increment()和Decrement()。这两个方法依赖于处理器的功能来执行快速的、线程安全的递增和递减运算。

          常量表达式

          根据定义,常量表达式是C#编译器能在编译时完成求值的表达式。

          const关键字会在编译时将值锁定。之后,代码中任何修改或锁定的值的尝试都会造成一个编译错误。

         

public Long Main()
          {
                   const int a = 60*60*24;//常量表达式
                   const int b = a*7;
          }

注意,赋给b的值也是一个常量表达式,因为表达式中的操作数也是常量,所以编译器能确定结果。

          逻辑运算符

          逻辑运算符有一个或两个布尔操作数,并返回一个布尔结果。逻辑运算符允许你合并多个布尔表达式,以构成其他布尔表达式。逻辑运算符包括||、&&和^,分别对应于OR、AND、XOR。

          1.OR运算符(||)

          ||运算符对两个布尔表达式进行求值,如果其中任何一个为true,就返回true

          2.AND运算符(&&)

          布尔AND运算符&&要求在两个操作数求值都为true的前提下才返回true。任何一个操作数为false,就会返回false。

          3.XOR运算符(^)

          ^符号是异或运算符。若应用于两个布尔操作数,那么只有在两个操作数中仅有一个为true的前提下,XOR运算符才会返回true。

          与布尔AND和OR不同,布尔XOR运算符不支持短路运算。 它始终都要检查两个操作数,因为除非确切地知道两个操作数的值,否则不能判定最终结果。

          逻辑求反运算符 

          逻辑求反运算符(!)有时也称为NOT运算符,它的作用是反转一个bool数据类型的值,这是一个一元运算符,只需要一个操作数。

          条件运算符

          可以使用条件运算符来取代if语句。条件运算符是一个问号(?),其常规格式如下:

          a?1:2;

          条件运算符是三元运算符,因为它需要3个操作数:a、1、2。

          如果a求值为true,则条件运算符返回1,否则返回2。