8.1 表达式
表达式是运算符和操作数的字符串。
8.2 字面量
字面量(literal)是原代码中书写的数字或字符串,表示一个明确类型的明确的、固定的值。
整数字面量
整数类型字面量还可以被写在16进制(hex)形式。数字必须是16进制数(从0到F),而且字符串必须以0x或0X开始。
实数字面量
实数字面量的后缀 F、f 代表 float D、d代表double M、m 代表 decimal 无后缀代表double
字符字面量
字符字面量由单引号内的字符表示组成。字符字面是一可以是下面的任意一种:单个字符、一个简单转义序列、一个十六进制转义序列或一个Unicode转义序列。
- 字符字面量的类型是char。
- 简单转义序列是一个反斜杠后面跟着单个字符。
- 十六进制转义序列是一个反斜杠,后面跟着一个大写或小写的x,后面再跟着多至四个十六进制数字。
- unicode转义序列是一个反斜杠,后面跟着一个大写或小写的u,后面再跟着多至四个十六进制的数字。
| 名称 | 转义序列 | 十六进制编码 |
|---|---|---|
| 空字符(Null) | \0 | 0x0000 |
| 警告(Alert) | \a | 0x0007 |
| 退格符(Backspace) | \b | 0x0008 |
| 水平制表符(Horizontal Tab) | \t | 0x0009 |
| 换行符 | \n | 0x000A |
| 垂直制表符(Vertial Tab) | \b | 0x000B |
| 换页符 | \f | 0x000C |
| 回车符 | \r | 0x000D |
| 双引号 | \" | 0x0022 |
| 单引号 | \' | 0x0027 |
| 反斜杠 | \\ | 0x005C |
字符串字面量
字符串字面量使用双引号标记。有两种字符串字面量类型:
- 规则字符串字面量
- 逐字字符串字面量
- 字符
- 简单转义字符
- 十六进制和unicode转义序列。
- 逐字字面量与规则字符串字面量区别在于转义字符串不会被求值。在双引号中间的所有东西,包括通常被认为是转义序列的东西,都被严格按字符串中列出的那样打印。
- 逐字字面量的唯一例外是相邻的双引号组,它们被解释为单个双引号字符。
8.3 求值顺序
优先级
| 分类 | 运算符 |
|---|---|
| 初级运算符 | a.X 、f(x)、a[x]、x++、x--、new、typeof、checked、unchecked |
| 一元运算符 | +、-、!、~、++x、--x、(T)x |
| 乘法 | *、/、% |
| 加法 | +、- |
| 移位 | <<、>> |
| 关系和类型 | <、>、<=、>=、is、as |
| 相等 | ==、!= |
| 位与 | & |
| 位异或 | ^ |
| 位或 | | |
| 条件与 | && |
| 条件或 | || |
| 条件选择 | ?: |
| 赋值运算符 | =、*=、/=、%=、+=、-=、<<=、>>=、&=、^=、|= |
结合性
当连接的去处符有相同的优先级时,求值顺序由操作结合性决定。也就是说,已知两个相同的优先级的运算符,依照运算符的结合性,其中的一个或另一个优先。
运算符的结合性的一些重要特征:
- 左结合运算符从左至右求值。
- 右结合运算符从右至左求值。
- 除赋值运算符以外,二元运算符是左结合。
- 赋值运算符和条件运算符是右结合的。
- 覆写优先级和结合性规则。
- 求值顺序从最内嵌套到最外部。
8.6 关系比较运算符和相等比较运算符
关系比较运算符和相等比较运算符是二元运算符,比较它们的操作数并返回bool型值。
<、>、<=、>=、==、!=
与C和C++不同,在C#中数字不具有布尔意义。
比较操作和相等性操作
当比较大多数引用类型的相等时,只有引用被比较
- 如果引用相等, 也就是说,如果它们指向内丰了中相同对象,那么相等性比较为true,否则为false,即使内存中两个分享的对象在所有其他方面都完全相等。
- 这称为浅比较。
- 如果两个字符串有相同的长度和相同大小写敏感的内容,那么相等性比较返回true,即使它们占用不同的内存区域。
- 这称为深比较。(deep comparison)。
这些运算符是一元的,并有两种形式:前置形式和后置形式。++x 和 x++;
比较运算符的前置和后置形式
- 无论运算符使用前置形式还是后置形式,在语句执行之后,最终存放在操作数的变量中的值是相同的。
- 唯一不同的是运算符返回给表达式的值。
8.8 条件逻辑运算符
逻辑与(AND)和逻辑或(OR)运算符是二元左结合运算符。逻辑非(NOT)是一元运算符。
条件逻辑运算符使用“短路”(short circuit)模式操作。
8.9 逻辑运算符
接位逻辑运算符常用于设置比特形式的方法参数。
& 位与 |位或 ^位异或 ~位非
8.10 移位运算符
按位移位运算符向左或向右把位组移动指定数量个位置,空出的位用0填充。
移位运算符是二元左结合运算符。
<<左移 >>右移
8.11 赋值运算符
=、*=、\=、%=、+=、-=、<<=、>>=、&=、^=、!=
8.12 条件运算符
?:
8.13 一元算术运算符
+ 、-
8.14 用户定义类型转换
可以为自己的类和结构定义隐式转换和显示转换。这允许把用户定义类型的对象转换成某个某他类型,反之亦然。
C#提供隐式转换和显式转换。
- 对于隐式转换,当在决定什么类型用于特定上下文时,如有必须,编译器会自动执行转换。
- 对于显式转换,编译器只在使用显式转换运算符才执行转换。
显示转换和强制转换运算符
强制转换运算符由想要把表达式转换成的类型的名称组成,在一对圆括号内部。 例: LimitedInt li=(LimitedInt)5
另外有两个运算符,接受一种类型的值,并返回另一种不同的、指定类型的值。is运算符和as运算符。
8.15 运算符重载
C#运算符被定义为使用预定主我类型作为操作数来工作。如果面对一个用户定义类型,运算符完成不知道如何处理它。运算符重载允许你定义C#运算符应该如何操作自定主我类型的操作数。
- 运算符重载只能用于类和结构
- 为类和结构重载一个运算符x,可以声明一个名称为operator x的方法并实现它的行为。(例如:operator + 和operator -等)。
- 一元运算符的重载方法速一个单独的class或struct类型的参数。
- 二元运算符的重载方法带两个参数,其中至少有一个必须是class或struct类型。
- 带static和public两个修饰符。
- 类或结构的成员,廖类或结构是它的一个操作数。
运算符重载的限制
不是所有运算符都能被重载,可以重载的类型也有限制。
只用有下面这些运算符可以被重载。列表中明显缺少的是赋值运算符。
可重载的一元运算符:+、-、!、-、++、--、true、false
可重载的二元运算符:+、-、*、、、%、&、|、^、<<、>>、==、!=、>、<、>=、<=
运算符重载不能做下面的事情:
- 创建新的运算符。
- 改变运算符的语法。
- 重新定义运算符如何处理预定义类型。
- 改变运算符的优先级和结合性。
不能重载typeof运算符,因为这会使.NET的类型安全机制失效。
typeof运算符还被GetType方法调用,该方法对每个类型的每个对象都有效。
191

被折叠的 条评论
为什么被折叠?



