表达式(expression)由操作数(operand)和运算符(operator)构成。表达式的运算符标明在操作数上运用了哪种操作。运算符的例子包括+、-、*、/和new。操作数的例子包括字面值、字段、局部变量和表达式。
当表达式包括多个运算符时,运算符的优先级(precedence)控制各个运算符执行的顺序。例如,表达式x+y*z将以x+(y*z)的形式计算,原因就是运算符“*”的优先级高于运算符“+”。
大多数运算符能够被重载(overload)。运算符的重载允许用户自定义运算符实现,用于为用户自定义的类或者结构类型指定操作方式。
表1.4总结了C#的运算符,运算符的分类排列是按其优先级从高到低的次序。同一分类的运算符具有相同的优先级。
表1.4 C#的运算符
分 类 |
表 达 式 |
描 述 |
基本 |
x.m |
成员访问 |
x(…) |
方法和委托调用 | |
x[…] |
数组和索引器访问 | |
x++ |
后增量(post-increment) | |
x-- |
后减量(post-decrement) | |
new T(…) |
对象和委托创建 | |
new T[…] |
数组创建 | |
typeof(T) |
获得T类型的System.Type对象 | |
checked(x) |
在检查的上下文计算表达式 | |
unchecked(x) |
在未检查的上下文计算表达式 | |
一元 |
+x |
表达式的值相同 |
-x |
求相反数 | |
!x |
逻辑求反 | |
~x |
按位求反 | |
++x |
前增量(pre-increment) | |
--x |
前减量(pre-decrement) | |
(T)x |
显式地将x的类型转换为类型T | |
乘除法 |
x*y |
乘 |
x/y |
除 | |
x%y |
求余 | |
加减 |
x+y |
加,字符串合并,委托组合 |
x-y |
减,委托移除 | |
移位 |
x<<y |
左移 |
x>>y |
右移 | |
关系和类型检测 |
x<y |
小于 |
x>y |
大于 | |
x<=y |
小于或者等于 | |
x>=y |
大于或者等于 | |
x is T |
如果x属于T类型,返回true;否则,返回false | |
x as T |
返回转换为类型T的x;如果x不是T,就返回null译注2 | |
相等 |
x==y |
等于 |
x!=y |
不等于 | |
逻辑与 |
x&y |
整型按位与,布尔型逻辑与 |
逻辑异或 |
x^y |
整型按位异或,布尔型逻辑异或 |
逻辑或 |
x|y |
整型按位或,布尔型逻辑或 |
条件与 |
x&&y |
如果x为true,则计算y |
条件或 |
x||y |
如果x为false,则计算y |
条件 |
x?y:z |
如果x为true,则计算y;如果x为false,则计算z |
赋值 |
x=y |
赋值 |
x op=y |
复合赋值;支持的运算符有: *= /= %= += -= <<= >>= &= ^= |= |