C# 运算符(operators)和表达式(expression)与C/C++几乎完全一样,仅有的区别如下:
基元(primary)运算符:C# 新增加了如下两个基元表达式运算符:
l checked(已检验)——用于设置溢出检验上下文(overflow-checking context),控制对整型算术表达式中的操作和转换进行溢出检验,在出现溢出时会抛出异常。格式为:checked(表达式)checked{语句块}
l unchecked(未检验)——用于设置溢出检验上下文(overflow-checking context),控制对整型算术表达式中的操作和转换不进行溢出检验,在出现溢出时不抛出异常,结果为截断后的整数。格式为:unchecked(表达式)unchecked{语句块}
例如:
InBlock.gif class Test {
InBlock.gif   static readonly int x = 1000000;
InBlock.gif   static readonly int y = 1000000;
InBlock.gif   static int F() {
InBlock.gif     return checked(x * y); // Throws OverflowException
InBlock.gif  }
InBlock.gif   static int G() {
InBlock.gif     return unchecked(x * y); // Returns -727379968
InBlock.gif  }
InBlock.gif   static int H() {
InBlock.gif     return x * y; // Depends on default
InBlock.gif  }
InBlock.gif}
又例如:
InBlock.gif try
InBlock.gif{
InBlock.gif         int i, i2 = int.MaxValue, i2 = 200;
InBlock.gif         i = checked(i1 * i2);    
InBlock.gif }
InBlock.gif catch(Exception e){
InBlock.gif         //MessageBox.Show(e.ToString());
InBlock.gif    Console.WriteLine(e.ToString());
InBlock.gif }
一元运算符:全局命名空间限定符::——虽然C# 不再支持全局变量和全局函数,但是仍然有全局命名空间,所以还是保留了全局命名空间限定符“::”(类似于C++的全局运算符::)。注意,因为在C# 中,双冒号符“::”已经不再作为命名空间之间和CLR对象与成员之间的分隔符,而是专用的全局命名空间限定符。
二元运算符:
l 模运算符%——在C# 中,%既可以用来求整数的余。也可以用于浮点数和十进制数。例如5 % 1.5 = 0.5
l 是运算符is——用于动态检验一个对象的运行时类型是否与指定类型兼容。格式为:
表达式 is 类型名
结果为一个布尔值,若表达式可以成功地转换成指定类型,则为true,否则为false
l 转为运算符as——用于将一个值显式地转换为一个指定的引用类型或可空(值)类型。格式为:
标识符 as 类型名
转换为引用类型时,采用的是引用转换或装箱转换;转换为可空类型时,采用的是包装转换、拆箱转换或空类型转换。与强制转换不同,as转换不会抛出异常。如果指定的转换是不可能的,则结果为空null
isas运算符在模板和泛型运算中非常有用。
l 空接合运算符(null coalescing operator??——用于在某个可空类型变量a的值为空时,提供备用的值b。格式为:
a ?? b
a非空时结果为a,否则为b。功能相对于:a.HasValue ? a : b。例如:
InBlock.gif double? x = null;
InBlock.gif //……
InBlock.gif double y = x ?? 0;
C# 表达式中运算符的优先级(order of precedence)与C++的类似,参见下表:(其中,红色的运算符是C# 特有的)
C# 运算符优先级表(从高到低)
优先级
类型
运算符
1
基元
. (成员,如 x.y )、 ( ) (函数,如 f(x) )、 [ ] (数组,如 a[i] )、 ++ (后缀增,如 i++ )、 -- (后缀减,如 i-- )、 new (创建对象,如 new MyClass )、 typeof (类型,如 typeof(x) )、 checked (已检验,如 checked(x*y) )、 unchecked (未检验,如 unchecked(x*y)
2
一元
+ (正,如 +x )、 - (负,如 -x )、!(逻辑非,如 !x )、 ~ (求补,如 ~x )、 ++ (前缀加,如 ++i )、 -- (前缀减,如 --i )、 () (强制类型转换,如 (int)x
3
乘性
* (乘,如 x*y )、 / (除,如 x/y )、 % (模,如 x%y
4
加性
+ (加,如 x+y )、 - (减,如 x-y
5
位移
<< (左移,如 i<<4 )、 >> (右移,如 i>>4
6
关系和
类型测试
< (小于,如 x<y )、 > (大于,如 x>y )、 <= (小于等于,如 x<=y )、 >= (大于等于,如 x>=y )、 is (是,如 x is int )、 as (转为,如 x as int
7
等性
== (相等,如 x==y )、 != (不等,如 x!=y
8
逻辑与
& (位与,如 x&4
9
逻辑异或
^ (位异或,如 x^y
10
逻辑或
| (位或,如 x|y
11
条件与
&& (逻辑与,如 x&&y
12
条件或
|| (逻辑或,如 x||y
13
空接合
?? (空接合,如 a??b
14
条件
?: (条件,如 x?a:b
15
赋值
= (等于,如 x=y )、 *= (乘等于,如 x*=y )、 /= (除等于,如 x/=y )、 += (加等于,如 x+=y )、 -= (减等于,如 x-=y )、 <<= (左移等于,如 x<<=y )、 >>= (右移等于,如 x>>=y )、 &= (位与等于,如 x&=y )、 ^= (位异或等于,如 x^=y )、 |= (位或等于,如 x|=y