书接上文的基本操作符,下文介绍的是其他操作符:
4.2一元操作符:
只要有一个操作数跟在它后面就可以构成表达式,也叫单目操作符。
①&x和*x操作符(很少见有印象即可):
这两个操作符同样也需要在不安全的上下文中运行:&是取地址操作符。
简单错误:pStu.错误:由于.为基本操作符优先级大于所以是先进行pStu.的操作正确应该为:(*pStu).即加个括号。
②+、-、!、~四个一元操作符:
-运算符可造成内存溢出:
int a = int.MinValue;
int b =checked( -a);//原因在于int.MaxValue与int.MinValue绝对值不一样。
~求反操作符,对操作数转化为2进制,进行二进制的按位取反。
计算机取相反数的原理:先把该数转化为2进制再按位取反+1
!操作符只能用来操作布尔类型的数据,
③++x;–x运算符:单独使用时x++与++x没有区别。
4.3、强制类型转化操作符:(T)x,T表示某种数据类型。
类型转换:
①隐式(implicit)类型转换,常见的为以下三种情况:
*不丢失精度的转换:小字节数(存储空间)的数据类型向多字节(存储空间)的数据类型转换不会丢失精度,比如金鱼从鱼缸里放到游泳池里还是好好的。例如:
int x = int.MaxValue;
long y = x;
这就是在不丢失精度的情况下进行的隐式类型转换,具体哪些数据类型可向哪些无丢失精度类型转换见C#语言定义文档6.1.2:
隐式数值转换为:(原则为从小的向大的转)
l 从 sbyte 到 short、int、long、float、double 或 decimal。
l 从 byte 到 short、ushort、int、uint、long、ulong、float、double 或 decimal。
l 从 short 到 int、long、float、double 或 decimal。
l 从 ushort 到 int、uint、long、ulong、float、double 或 decimal。
l 从 int 到 long、float、double 或 decimal。
l 从 uint 到 long、ulong、float、double 或 decimal。
l 从 long 到 float、double 或 decimal。
l 从 ulong 到 float、double 或 decimal。
l 从 char 到 ushort、int、uint、long、ulong、float、double 或 decimal。
l 从 float 到 double。
从 int、uint、long 或 ulong 到 float 的转换以及从 long 或 ulong 到 double 的转换可能导致精度损失,但决不会影响数值大小。其他的隐式数值转换决不会丢失任何信息。
不存在向 char 类型的隐式转换,因此其他整型的值不会自动转换为 char 类型。
*子类向父类的转换;
例如定义三个互相继承的类:
class Animal
{
public void Eat()
{
Console.WriteLine("Eat");
}
}
class Human:Animal
{
public void Think()
{
Console.WriteLine("think");
}
}
class Teacher:Human
{
public void Teach()
{
Console.WriteLine("Teach");
}
在main函数中:
Teacher t = new Teacher();
Human h = t;//这种就是子类向父类隐式类型换
而h.只能访问Human类的成员,不能访问Teacher类的成员,因为引用变量只能访问它这个变量的类型它所具有的成员,注意是这个变量的类型是(Human)而不是这个变量引用的类型(Teacher)。(简单的比喻比如人的父类是猴子,但猴子的只能做猴子的行为而不能做人类的行为。)
*装箱;见上一节。
②显式(explicit)