C# 运算符(operators)和表达式(expression)与C/C++几乎完全一样,仅有的区别如下:
基元(primary)运算符:C# 新增加了如下两个基元表达式运算符:
l
checked(已检验)——用于设置溢出检验上下文(overflow-checking context),控制对整型算术表达式中的操作和转换进行溢出检验,在出现溢出时会抛出异常。格式为:checked(表达式)或checked{语句块}。
l
unchecked(未检验)——用于设置溢出检验上下文(overflow-checking context),控制对整型算术表达式中的操作和转换不进行溢出检验,在出现溢出时不抛出异常,结果为截断后的整数。格式为:unchecked(表达式)或unchecked{语句块}。
例如:
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
又例如:
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
一元运算符:全局命名空间限定符::——虽然C# 不再支持全局变量和全局函数,但是仍然有全局命名空间,所以还是保留了全局命名空间限定符“::”(类似于C++的全局运算符::)。注意,因为在C# 中,双冒号符“::”已经不再作为命名空间之间和CLR对象与成员之间的分隔符,而是专用的全局命名空间限定符。
二元运算符:
l
模运算符%——在C# 中,%既可以用来求整数的余。也可以用于浮点数和十进制数。例如5 % 1.5 = 0.5。
l
是运算符is——用于动态检验一个对象的运行时类型是否与指定类型兼容。格式为:
表达式 is 类型名
结果为一个布尔值,若表达式可以成功地转换成指定类型,则为true,否则为false。
l
转为运算符as——用于将一个值显式地转换为一个指定的引用类型或可空(值)类型。格式为:
标识符 as 类型名
转换为引用类型时,采用的是引用转换或装箱转换;转换为可空类型时,采用的是包装转换、拆箱转换或空类型转换。与强制转换不同,as转换不会抛出异常。如果指定的转换是不可能的,则结果为空null。
is和as运算符在模板和泛型运算中非常有用。
l
空接合运算符(null coalescing operator)??——用于在某个可空类型变量a的值为空时,提供备用的值b。格式为:
a ?? b
当a非空时结果为a,否则为b。功能相对于:a.HasValue ? a : b。例如:
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
![InBlock.gif](https://s1.51cto.com/images/editer/InBlock.gif)
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
)
|
转载于:https://blog.51cto.com/tallbig/765864