通常将运算符分为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。