C# 运算符(operators)和表达式(expression)与C/C++几乎完全一样,仅有的区别如下:
基元(primary)运算符:C# 新增加了如下两个基元表达式运算符:
l checked(已检验)——用于设置溢出检验上下文(overflow-checking context),控制对整型算术表达式中的操作和转换进行溢出检验,在出现溢出时会抛出异常。格式为:checked(表达式)checked{语句块}
l unchecked(未检验)——用于设置溢出检验上下文(overflow-checking context),控制对整型算术表达式中的操作和转换不进行溢出检验,在出现溢出时不抛出异常,结果为截断后的整数。格式为:unchecked(表达式)unchecked{语句块}
例如:
(C#基本语法)4.运算符与表达式_C#class Test {
(C#基本语法)4.运算符与表达式_C#  static readonly int x = 1000000;
(C#基本语法)4.运算符与表达式_C#  static readonly int y = 1000000;
(C#基本语法)4.运算符与表达式_C#  static int F() {
(C#基本语法)4.运算符与表达式_C#    return checked(x * y); // Throws OverflowException
(C#基本语法)4.运算符与表达式_C#  }
(C#基本语法)4.运算符与表达式_C#  static int G() {
(C#基本语法)4.运算符与表达式_C#    return unchecked(x * y); // Returns -727379968
(C#基本语法)4.运算符与表达式_C#  }
(C#基本语法)4.运算符与表达式_C#  static int H() {
(C#基本语法)4.运算符与表达式_C#    return x * y; // Depends on default
(C#基本语法)4.运算符与表达式_C#  }
(C#基本语法)4.运算符与表达式_C#}
又例如:
(C#基本语法)4.运算符与表达式_C#try
(C#基本语法)4.运算符与表达式_C#{
(C#基本语法)4.运算符与表达式_C#         int i, i2 = int.MaxValue, i2 = 200;
(C#基本语法)4.运算符与表达式_C#         i = checked(i1 * i2);    
(C#基本语法)4.运算符与表达式_C# }
(C#基本语法)4.运算符与表达式_C# catch(Exception e){
(C#基本语法)4.运算符与表达式_C#         //MessageBox.Show(e.ToString());
(C#基本语法)4.运算符与表达式_C#    Console.WriteLine(e.ToString());
(C#基本语法)4.运算符与表达式_C# }
一元运算符:全局命名空间限定符::——虽然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。例如:
(C#基本语法)4.运算符与表达式_C#double? x = null;
(C#基本语法)4.运算符与表达式_C#//……
(C#基本语法)4.运算符与表达式_C#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