C#表达式与运算符


表达式

表达式是由运算符和操作数组成的

运算符设置将对操作数进行什么样的运算

操作数包括文本、常量、变量和表达式

在C#中,如果表达式最终的计算结果为所需的类型值,表达式就可以出现在需要值或对象的任意位置

运算符

运算符是一些特殊的符号,主要用于数学函数、一些类型的赋值语句和逻辑比较方面

C#中提供了丰富的运算符,例如:算术运算符、赋值运算符、比较运算符等

算术运算符

+-*/%运算符都称为算术运算符,分别用于进行加、减、乘、除和模(取余)运算

C#中的算术运算符的功能及使用方法

运算符 说明 实例 结果
+ 12.45f + 15 27.45
4.56 – 0.16 4.4
* 5L * 12.45f 62.25
/ 7 / 2 3
% 取余 12 % 10 2

其中+-运算符还可以作为数据的正负符号,例如+5-7

加法运算符通过两个数相加来执行标准的加法运算

减法运算符通过从一个表达式中减去另一个表达式的值来执行标准的减法运算

乘法运算符将两个表达式进行乘法运算并返回它们的乘积

除法运算符执行算术除运算,它用被除数表达式除以除数表达式除以除数表达式而得到商

在用算术运算符运算+-*/时,产生的结果可能会超出所涉及数值类型的值的范围,这样子就会导致运行结果不正确

取余运算符返回除数与被除数相除之后的余数,通常用这个运算符来创建余数在特定范围内的等式

赋值运算符

赋值运算符为变量、属性、事件等元素赋新值

赋值运算符主要有=+=-=*=/=%=&=|=^=<<=>>=

赋值运算符的左操作数必须是变量、属性访问、索引器访问或事件访问类型的表达式

如果赋值运算符两边的操作数的类型不一致,就需要首先进行类型转换,然后再赋值

在使用赋值运算符时,右操作数表达式所属类型必须可以隐式转换为左操作数所属的类型

运算将右操作数的值赋给左操作数指定的变量、属性或索引器元素

C#中的赋值运算符及其运算规则

名称 运算符 运算规则 意义
赋值 = 将表达式赋值给变量 将右边的值给左边
加赋值 += x += y x = x + y
减赋值 -= x -= y x = x – y
除赋值 /= x /= y x = x / y
乘赋值 *= x *= y x = x * y
模赋值 %= x %= y x = x % y
位与赋值 &= x &= y x = x & y
位或赋值 |= x |= y x = x | y
右移赋值 >>= x >>= y x = x >> y
左移赋值 <<= x <<= y x = x << y
异或赋值 ^= x ^= y x = x ^ y

在C#中可以把赋值运算符连在一起使用x = y = z = 5执行完毕后,x、y、z 均为 5

关系运算符

关系运算符属于二元运算符,用于程序中的变量之间、变量和自变量之间以及其他类型的信息之间的比较,它返回一个代表运算结果的布尔值

当关系运算符对应的关系成立时,运算结果为true,否则为false

所有的关系运算符通常用在条件语句中来作为判断的依据,C#中的关系运算符共有6个

关系运算符

运算符 作用 举例 操作数类型 结果
> 比较左边是否大于右边 ‘a’ > ‘b’ 整型、浮点型、字符型 false
< 比较左边是否小于右边 156 < 456 整型、浮点型、字符型 true
== 比较左边是否等于右边 ‘c’ == ‘c’ 基本数据类型、引用型 true
>= 比较左边是否大于或等于右边 479 >= 426 整型、浮点型、字符型 true
<= 比较左边是否小于或等于右边 12.45 <= 45.5 整型、浮点型、字符型 true
!= 比较左边是否不等于右边 ‘y’ != ‘t’ 基本数据类型、引用型 true

要查看两个表达式是否相等,可以使用相等运算符==,相等运算符对整型、浮点型和枚举类型数据的操作是一样的,它只是简单的比较两个表达式,并返回一个布尔值

不等运算符!=是与相等运算符相反的运算符,有两种格式的不等运算符可以应用到表达式,一种是普通的不等运算符!=;另一种是相等运算符的否定!(a == b),通常,这两种格式都可以计算出相同的值

如果要比较一个值是否小于另一个值,可以使用小于运算符<,当左边的表达式的值小于右边的表达式的值时,结果为真,否则结果为假

如果要比较一个值是否大于另一个值,可以使用大于运算符>,当左边的表达式的值大于右边的表达式的值时,结果为真,否则结果为假

在使用小于或大于运算符对值进行判断时,如果把判断符左右两边的值进行调换,其判断结果也会随之改变

如果要比较一个值是否小于或等于另一个值,可以使用小于或等于运算符<=,当左边的表达式的值小于或等于右边的表达式的值时,结果为真,否则结果为假

如果要比较一个值是否大于或等于另一个值,可以使用大于或等于运算符>=,当左边的表达式的值大于或等于右边的表达式的值时,结果为真,否则结果为假

关系运算符一般常用于判断或循环语句中

逻辑运算符

返回类型为布尔值的表达式,如关系运算符,可以被组合在一起构成一个更复杂的表达式,这是通过逻辑运算符来实现的

在C#中的逻辑运算符主要包括逻辑与&&、逻辑或||、逻辑非!

逻辑运算法的操作数必须是布尔型数据

在逻辑运算符中,除了逻辑非!是一元运算符外,其他都是二元运算符

逻辑运算符的用法和含义

运算符 含义 用法 结合方向
&& 逻辑与 a && b 左到右
|| 逻辑或 a || b 左到右
逻辑非 !a 右到左

结果为布尔型的变量或表达式可以通过逻辑运算符组合为逻辑表达式

使用逻辑运算符进行逻辑运算

表达式1 表达式2 表达式1 && 表达式2 表达式1 || 表达式2 !表达式1
true true true true false
true false false true false
false true false true true
false false false false true

在逻辑表达式中从左端的表达式可以推断出整个表达式的值,称为“短路”

始终执行运算符两边的表达式称为“非短路”

逻辑与&&属于“短路”运算符

位运算符

位运算符除按位与&、按位或|运算符外,其他只能处理整数的操作数

位运算符是完全针对位方面的操作

整型数据在内存中以二进制的形式表示

按位与

“按位与”运算的运算符为&

“按位与”运算的运算法则是:如果两个整型数据a、b对应位都是1,则结果位才是1;否则结果位是0

如果两个操作数的精度不同,则结果的精度与高精度的操作数相同

按位或

“按位或”运算的运算符为|

“按位或”运算的运算法则是:如果两个整型数据a、b对应位都是0,结果位才是0;否则是1

如果两个操作数的精度不同,则结果的精度与精度高的操作数相同

按位取反

“按位取反”运算也称为“按位非”运算,运算符为~

“按位取反”就是将操作数二进制中的1改成0,0改成1

按位异或

“按位异或”运算的运算符^

“按位异或”运算的运算法则是:当两个操作数的二进制表示相同(同时为0或者同时为1)时,结果为0,否则结果为1

若两个操作数的精度不同,则结果数的精度与精度高的操作数相同

移位操作

可以对数据按二进制位进行移位操作

C#中的移位运算符有以下两种:

<<左移,>>右移

对于 X << N 或者 X >> N 形式的运算,含义是将 X 向左或向右移 N 位,得到的结果的类型与 X 相同

在此处 X 的类型只能是 int 、uint 、 long 或 ulong ,N 的类型只能是 int ,或者显示转换为这些类型之一,否则编译程序时会出现错误

左移就是将左边的操作数在内存中的二进制数据左移右边操作数指定的位数,右边移空的部分补0

右移时,如果最高位是0,左移空的位就填入0;如果最高位是1,左移空的位就填入1

移位可以实现整数除以或者乘以2的n次方的效果

一个数左移n位,就是将这个数乘以2的n次方

一个数右移n位,就是将这个数除以2的n次方

其他特殊运算符

C#中还有一些运算符不能简单的归到某个类型中

is 运算符

is 运算符用于检查变量是否为指定的类型。如果是则返回真,否则,返回假

不能重载 is 运算符

is 运算符值考虑引用转换、装箱转换和取消装箱转换,不考虑其他转换,例如用户定义的转换

条件运算符

条件运算符(?:)根据布尔型表达式的值返回两个值中的一个

如果条件为 true,则计算第一个条件表达式并以它的结果为准

如果条件为 false ,则计算第二个表达式并以它的结果为准

条件式 ? 值1 : 值2

new运算符

new 运算符用于创建一个新的类型实例

  • 对象创建表达式,用于创建一个类类型或值类型的实例
  • 数组创建表达式,用于创建一个数组类型实例
  • 代表创建表达式,用于创建一个新的代表类型实例

typeof 运算符

typeof运算符用于获得系统原型对象的类型,也就是Type对象

Type类包含关于值类型和引用类型的信息

typeof运算符可以在C#语言中各种位置使用,以找出关于引用类型和值类型的信息

运算符优先级

C#中的表达式是使用运算符连接起来的符合C#规范的式子

运算符的优先级决定了表达式中运算执行的先后顺序

通常优先级由高到低的顺序依次是:

  1. 增量和减量运算
  2. 算术运算
  3. 关系运算
  4. 逻辑运算
  5. 赋值运算

如果两个运算符有相同的优先级,那么左边的表达式要比右边的表达式先被处理

在表达式中,可以通过括号来调整运算符的运算顺序,将想要优先运算的运算符放置在括号内

当程序开始执行时,括号内的运算符会被优先执行

运算符从高到低的优先级顺序

分类 运算符
基本 x.yf(x)a[x]x++ x--newtypeof checked unchecked
一元 +-!~++x--x(T)x
乘除 */%
加减 +-
移位 <<>>
比较 <><=>=isas
相等 ==!=
位与 &
位异或 ^
位或 |
逻辑与 &&
逻辑或 ||
条件 ?:
赋值 =+=-=*=/=%=&=|=^=<<=>>=

在编写程序时,尽量使用括号运算符来限定运算次序,避免产生错误的运算顺序