08. 表达式和运算符

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)\00x0000
警告(Alert)\a0x0007
退格符(Backspace)\b0x0008
水平制表符(Horizontal Tab)\t0x0009
换行符\n0x000A
垂直制表符(Vertial Tab)\b0x000B
换页符\f0x000C
回车符\r0x000D
双引号\"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.4 简单算术运算符
+、-、*、/

8.5 求余运算符
求余运算符(%)用第二个操作数除第一个操作数,忽略掉商,并返回余数。


8.6 关系比较运算符和相等比较运算符

关系比较运算符和相等比较运算符是二元运算符,比较它们的操作数并返回bool型值。

<、>、<=、>=、==、!=

与C和C++不同,在C#中数字不具有布尔意义。

比较操作和相等性操作

当比较大多数引用类型的相等时,只有引用被比较

    • 如果引用相等, 也就是说,如果它们指向内丰了中相同对象,那么相等性比较为true,否则为false,即使内存中两个分享的对象在所有其他方面都完全相等。
    • 这称为浅比较。
string类型对象也是引用类型,但它的比较方式不同。比较字符串的相等性时,比较它们的长度和大小写敏感的内容。
    • 如果两个字符串有相同的长度和相同大小写敏感的内容,那么相等性比较返回true,即使它们占用不同的内存区域。
    • 这称为深比较。(deep comparison)。
委托也是引用类型,并且也使用深比较。比较委托的相等性时,如果两个委托都是null,或两者的调用列表中有相同数目的成员,并且调用列表相匹配,那么比较返回true。
比较数值表达式时,类型和值被比较。
比较enum类型时,比较操作数的底层值。

8.7 递增运算符和递减运算符
++ --

这些运算符是一元的,并有两种形式:前置形式和后置形式。++x 和 x++;

比较运算符的前置和后置形式

    • 无论运算符使用前置形式还是后置形式,在语句执行之后,最终存放在操作数的变量中的值是相同的。
    • 唯一不同的是运算符返回给表达式的值。

8.8 条件逻辑运算符

逻辑与(AND)和逻辑或(OR)运算符是二元左结合运算符。逻辑非(NOT)是一元运算符。

条件逻辑运算符使用“短路”(short circuit)模式操作。


8.9 逻辑运算符

接位逻辑运算符常用于设置比特形式的方法参数。

& 位与      |位或      ^位异或  ~位非


8.10 移位运算符

按位移位运算符向左或向右把位组移动指定数量个位置,空出的位用0填充。

移位运算符是二元左结合运算符。

<<左移    >>右移


8.11 赋值运算符

      =、*=、\=、%=、+=、-=、<<=、>>=、&=、^=、!=


8.12 条件运算符

?:

8.13 一元算术运算符

+ 、-


8.14 用户定义类型转换

可以为自己的类和结构定义隐式转换和显示转换。这允许把用户定义类型的对象转换成某个某他类型,反之亦然。

C#提供隐式转换和显式转换。

  • 对于隐式转换,当在决定什么类型用于特定上下文时,如有必须,编译器会自动执行转换。
  • 对于显式转换,编译器只在使用显式转换运算符才执行转换。
声明隐式转换的语法如下。public和static修饰符是所有用户定义转换必需的。
public static implicit operatorTargetType (SourceType Identifier)
{
return ObjectOfTargetType
}
显示转换的语法之与相同,除了explicit替换掉implicit。


显示转换和强制转换运算符

强制转换运算符由想要把表达式转换成的类型的名称组成,在一对圆括号内部。 例: LimitedInt li=(LimitedInt)5

另外有两个运算符,接受一种类型的值,并返回另一种不同的、指定类型的值。is运算符和as运算符。


8.15 运算符重载

C#运算符被定义为使用预定主我类型作为操作数来工作。如果面对一个用户定义类型,运算符完成不知道如何处理它。运算符重载允许你定义C#运算符应该如何操作自定主我类型的操作数。

  • 运算符重载只能用于类和结构
  • 为类和结构重载一个运算符x,可以声明一个名称为operator x的方法并实现它的行为。(例如:operator + 和operator -等)。
    • 一元运算符的重载方法速一个单独的class或struct类型的参数。
    • 二元运算符的重载方法带两个参数,其中至少有一个必须是class或struct类型。
例:
public static LimitedInt operator -(LimitedInt x)

public static LimitedInt operator +(LimitedInt x,double y)

运算符重载方法必须被声明为:
  • 带static和public两个修饰符。
  • 类或结构的成员,廖类或结构是它的一个操作数。

运算符重载的限制

不是所有运算符都能被重载,可以重载的类型也有限制。

只用有下面这些运算符可以被重载。列表中明显缺少的是赋值运算符。

可重载的一元运算符:+、-、!、-、++、--、true、false

可重载的二元运算符:+、-、*、、、%、&、|、^、<<、>>、==、!=、>、<、>=、<=

运算符重载不能做下面的事情:

    • 创建新的运算符。
    • 改变运算符的语法。
    • 重新定义运算符如何处理预定义类型。
    • 改变运算符的优先级和结合性。
8.16 typeof 运算符
typeof运算符返回作为它的参数的任何类型的System.Type对象。通过这个对象,可以得到类型的特征。(对任何已知类型,只有一个System.Type对象。)
typeof运算符是一元运算符。

不能重载typeof运算符,因为这会使.NET的类型安全机制失效。

typeof运算符还被GetType方法调用,该方法对每个类型的每个对象都有效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值