表达式与运算符
1 表达式
表达式是由运算符和操作数组成的。+、-、*、/ 都是运算符。操作数包括文本、常量、变量、表达式。
2 运算符
2.1 算数运算符
运算符 | 名称 | 备注 |
---|---|---|
+ 、-、*、/ | 加减乘除 | |
% | 取余 | 在获取两个数相除的余数时,除了使用%运算符,还可以用Math类中的DivRem方法来实现,如 a = c%d 可以写成 Math.DivRem(b,c,out a) |
++ | 增量运算符 | 分前缀增量操作和后缀增量操作 |
– | 减量运算符 | 分前缀减量操作和后缀减量操作 |
2.2 赋值运算符
运算符 | 名称 | 运算符 | 名称 | 运算符 | 名称 |
---|---|---|---|---|---|
= | 等于 | += | 加等于 | -= | 减等于 |
*= | 乘等于 | /= | 除等于 | %= | 取余等于 |
&= | 位与 | |= | 位或 | ||
>>= | 右移 | <<= | 左移 | ^= | 异或 |
赋值运算符的左操作数必须是变量、属性访问、所引器访问、事件访问 类型的表达式,如果赋值运算符俩边的操作数类型不一致,就需要先进行类型转换再赋值。
在使用赋值运算符时,右操作数表达式所属的类型必须可以隐式转换为左操作数所属类型。
2.3 关系运算符
关系运算符属于二元运算符,用于程序中的变量之间、变量和自变量之间以及其他类型的信息之间的比较,它返回一个代表运算结果的布尔值。当运算符对应的关系成立时,运算结果为true,否则为false。所有关系运算符通常用在条件语句中来作为判断的依据。
关系运算符就好像对俩个铁球进行比较,比较哪个更大,重量是否相等,并给出一个真或假的值。
C#中的关系运算符共有6个,如下表所示:
运算符 | 作用 | 结果 |
---|---|---|
> | 左比数是否大于右比较数 | true/false |
< | 左比数是否小于右比较数 | true/false |
== | 左比数是否等于右比较数 | true/false |
>= | 左比数是否大于等于右比较数 | true/false |
<= | 左比数是否小于等于于右比较数 | true/false |
!= | 左比数是否不等于右比较数 | true/false |
2.4 逻辑运算符
返回类型为布尔值的表达式,如关系运算符可以被组合在一起构成一个更复杂的表达式,这是通过逻辑运算符类实现的。
运算符 | 含义 | 结果 |
---|---|---|
&& | 短路逻辑与(效率更高,第一个表达式结果如为false,则不去判断第二个表达式) | true/false |
& | 非短路逻辑与(俩个表达式都会判断) | true/false |
|| | 逻辑或 | true/false |
! | 逻辑非 | true/false |
2.5 位运算符
位运算符除按位与、按位或外,其他只能用于处理整数操作数。位运算是完全针对位方面的操作。如果俩个操作数的精度不同,则结果的精度与精度高的操作数相同。
运算符 | 含义 | 计算方式 |
---|---|---|
& | 按位与 | 如果俩个整型数据a、b对应位都是1,则结果为1,否则为0 |
| | 按位或 | 如果俩个整型数据a、b对应位都是0,则结果为0,否则为1 |
^ | 按位异或 | 如果俩个整型数据a、b对应位都是0或者都是1,则结果为0,否则为1 |
<< | 左移 | 移空补0 |
>> | 右移 | 移空补最高位,最高位是1补1,最高位是0补0。(最高位是0则表正数,1为负数) |
技巧
位移可以实现整数除以或乘以2n的效果。
y << 2 = y * 2^2^ ;
y >> 4 = y / 2^4^ ;
2.6 其它特殊运算符
2.6.1 is运算符
is运算符用于检查变量是否为指定的类型。返回值为布尔类型。
int a = 0 ;
bool result = a is int ; //判断a是否为指定类型
注意
不能重载is运算符。is运算符这能考虑引用转换、装箱转换和拆箱转换。
2.6.2 条件运算符
条件式?值1:值2
根据布尔型表达式的值,返回俩个值中的一个。如果条件为true,则返回第一个表达式,否则返回第二个表达式。
int a = 1,b = 2 ;
int c = a>b?a:b ; //将a、b中大的值赋给c
2.6.3 new运算符
new运算符用于创建一个新的类型实例
- 对象创建表达式,用于创建一个类类型或值类型的实例。
- 数组创建表达式,用于创建一个数组类型的实例。
- 代表创建表达式,用于常见一个新的代表类型实例。
2.6.4 typeof运算符
typeof运算符用于获得系统原型对象的类型,也就是Type对象。Type类包含关于值类和引用类型的信息。typeof运算符可以再C#语言中的各个位置使用,以找出关于引用类型和值类型的信息。
using System;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Type mytype = typeof(int);
Console.WriteLine("类型:{0}", mytype); // 类型:System.Int32
Console.ReadKey();类型:System.Int32
}
}
}
3 运算符优先级
C#中的表达式是使用运算符连接起来符合C#规范的式子,运算符的优先级决定了表达式中运算执行的先后顺序。
通常有衔接由高到底的书序依次是:
增量和减量运算>算数运算 > 关系预算 >逻辑运算> 赋值运算
如果俩个运算符有相同的优先级,那么左边的要比右边得先被处理。可以通过括号()来调整运算符的顺序,括号内的表达式会被优先执行。