运算符是进行某种运算的符号,运算数包含变量常量。
算数运算符
字符串运算符 唯一“+” 除了作为算数运算符外,还可以将字符串连接起来成为新的字符串。
string s = "hello";//定义一个字符串变量
s = s+" ,world. ";//连接字符串
Console.writeLine(s);//输出“hello,wrorld.”
赋值运算符 =
赋值运算符用来改变变量的值,赋值运算构成的表达式时赋值表达式,在赋值表达式中,结果的类型是左边变量的数据类型
int i = (int) (2.8*4);//结果为11而不是11.2
关系运算符 用来比较 attention:只能用来比较同类型的数据。
用于比较两个运算数,结果为true和非0时,对应值为1否则为0
10>5 结果为true
2>3 结果为false
关系运算符有< , <= , > , >=, == ,!=
逻辑运算符 用于布尔值
! ,&&, ||
其中,&& 和|| 是双目运算符,要求有两个运算对象,&&的优先级更高,! 优先级更高。
位运算符
位运算符的运算对象必须为整数,位运算符有~,<<, >>,&,|,^.
设计一个控制台程序说明位运算符的应用
static void Main(string[] args)
{
byte b1, b2, b3;
b1 = 10;
b2 = (byte)~b1;//~b1 的结果为int,需要强制转换成byte类型
Console.WriteLine(b2);
b3 = (byte)(b1 << 2);//b1<<b2的结果int类型,需要强制转换成byte类型
Console.WriteLine(b3);
b1 = 3; b2 = 6;
b3 = (byte)(b1 & b2);//b1 &b2 的结果为int类型,需要强制转换成byte类型
Console.WriteLine(b3);
b3 = (byte)(b1 ^ b2);//b1^b2 的结果为int类型,需要强制转换成byte.
Console.WriteLine(b3);
b3 = (byte)(b1|b2);//b1|b2的结果为int类型,需要强制转换成byte类型
Console.WriteLine(b3);
}
在上述程序中,b1 = 10 ,对应二进制数[00001010]
按位求反,b2 = 二进制[11110101];对应十进制数245
将b1左移两位后,b3=[00101000]对应十进制数40
b1 = 3 =[00000011],b2 =6= [00000110],b1&b2 = [00000010],b1^b2=[00000101] = 5 ,b1|b2 = [00000111] = 7
结果如下:
条件运算符
1 是三元运算符
2 格式:表达式1?表达式2:表达式3
3 计算表达式1布尔值
若为true ----表达式2的值作为整个表达式的值
若为false-----表达式3的值为整个表达式的值
max = a>b>?a:b
//若a>b max = a;
否则max = b ;
其他运算符
1 sizeof 运算符
用于求值类型数据在内存中占用的字节数:
sizeof(类型标识符)
其结果为一个整数,表示指定类型的数据存在内存分配的字节数,只能用于值类型和值类型变量。
static void Main(string[] args)
{
Console.WriteLine("byte类型所占字节数:{0}",sizeof(byte));
}
2 typeof 运算符
用于一个标识表达式的数据类型的字符串,例如:
Console.WriteLine(typeof(Student));
输出Student 结构类型的程序名
3 new运算符
用于创建一个类的对象
4checked 和Unchecked
checked 用于对整型算数运算和转换显式启用溢出检查
在默认情况下,如果表达式仅包含常数值,且产生的值在目标类型范围之外,则会导致编译器错误。
int i = int.MaxValue + 10 ;//int.MaxValue 为int 型的最大值
Console.WriteLine (i);
上述代码在运行时会导致编译器错误,如果表达式包含一个或多个非常数值,则编译器不检测溢出。
int n = 10 ;
int i = int.MaxValue + n ;
Console.WriteLine (i);
在运行时不检查这些非常数表达式是否溢出,这些表达式不引发溢出异常,其输出为2147483639,作为两个正整数之和。
用户可以通过编译器选项,环境配置或使用checked关键字来启用溢出检查,例如:
int n = 10 ;
Console.WriteLine(checked(int.MaxValue + n));
or
checked //checked块
{
int n = 10 ;
int i = int.MaxValue + n;
Console.WriteLine(i);
}
使用checked块,在运行时检测求和计算导致的溢出,所以都会计算溢出
unchecked 用于取消整型算数运算和转换的溢出检查
Console.WriteLine(unchecked(int.MaxValue + 10 ));
or
unchecked
{
int i = int.MaxValue +10 ;
Console.WriteLine(i);
}
它们的输出均为2147483639,若移除unchecked环境,则会发生编译错误,因为表达式的各个项都是常数,所以可以在编译时检测出溢出。
默认情况下,在编译时和运行时不检查包含非常数项的表达式。因为溢出检查比较耗时,所以当无溢出危险,不检查代码可以提高性能,若出现溢出,应该使用检查环境。
运算符优先级