您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 第四章操作符和表达式
C#语言程序设计李朔@数信学院Email:chn.nj.ls@gmail.comC#语言程序设计基础第4章操作符和表达式操作符算术表达式位运算表达式赋值表达式关系表达式条件逻辑表达式其它特殊表达式程序中的表达式是操作数和操作符按一定规则组成的有意义的式子。表达式:操作数+操作符操作数:一个常量、变量或另一表达式操作符(operator,也叫运算符)一元操作符:opx二元操作符:xopy三元操作符:?:一条程序语句要么是一个简单表达式,要么是多个表达式的复合。操作符操作符优先级包含多个操作符的复合表达式,操作顺序由操作符的优先级决定,大致次序括号优先级最高一元操作符算术操作符(先乘除后加减,左至右)关系操作符(,,=,=,==,!=)逻辑操作符(&&||)三元操作符?:赋值操作符(P77)操作符的优先级类别操作符优先级一元操作符基本一元操作符(x)x.yf(x)a[x]x++x--newtypeofsizeofcheckedunchecked高↓低一元操作符+-!~++x--x(T)x算术操作符乘、除操作符*/%加减操作符+-移位操作符关系操作符关系操作符==isas等式操作符==!=位操作符逻辑与操作符&逻辑异或操作符^逻辑或操作符|逻辑操作符条件与操作符&&条件或操作符||三元(条件)操作符?:赋值操作符赋值操作符=*=/=%=+=-===&=^=|=同优先级操作符,按照出现次序及操作符结合性来决定求值的顺序:赋值操作符与逻辑操作符属于右结合的操作符,优先级相同,按从右向左的顺序进行运算intx=0,y=20;x=y=10;//y=10;x=10;其它所有操作符属于左结合的操作符,在优先级相同的情况下,自左向右,顺序运算括号优先级最高,可使用括号控制运算顺序并获得良好的可读性算术表达式+-*/%基本算术运算(数值类型)注意类型范围和精度整数运算溢出,按相反数处理(若使用了/checked编译选项,则程序引发异常)实数运算超出范围时,结果会被设置为无穷大(符号取决于操作数的正负)当两种不同类型的操任数进行运算时,结果类型同精度高的类型5/2.0;//2.55/2;//2模操作符%5%2;//结果:1C#中的取模操作:5%1.5//结果:0.5C#中整数运算不能除以0常数0,编译报错变量值0,运行时引发异常实数运算中,可以除以00除以0得非数字非数字参加的运算结果均为非数字对枚举类型和字符类型,可使用+,-操作符枚举或字符-整数值,运算后,整数值-枚举或字符对枚举而言,若运算结果超过了枚举定义的整数范围,枚举值有效,只是以整数形式来表现字符串相加(字符串连接)若加法运算中只有一个操作数是字符串类型,加法操作会通过Object类型的ToString方法得到另一个操作数的字符串表示,再连接委托加减(称为委托的合并和删除),通过委托合并,可一次调用同一对象的多个方法任何委托变量加上或减去null仍为其本身委托删除运算时,若作为减数的委托不在被减数的委托中,那么删除运算不会产生任何效果自增和自减表达式x++:x=x+1x−−:x=x−1先加减后使用/先使用后加减位运算:作用于整数的二进制操作补~与&或|异或^左移位右移位不会发生溢出操作数要求是整数类型,或可转换成整数类型的其它类型二进制运算具有很高的效率自学4.4.1~4.4.3赋值表达式等号赋值右结合性x1=x2=x3=5;//等价于x1=(x2=(x3=5))复合赋值x+=yx=x+y;x&=yx=x&y;关系表达式关系表达式用于对指定的条件进行断返回布尔值做为判断结果:trueorfalse比较操作符:==!===类型兼容(isa关系)is比较运算==!=整数类型、实数类型、枚举类型、布尔类型和引用类型值类型:操作数所包含值是否相等引用类型:操作数是否指向同一个对象(或同为null)intx1=5,x2=2+3;//x1==x2?objecto1=x1;objecto2=x2;//o1==o2?很多引用类型可以重载相等和不等,这样就可以自定义两个对象是否相等的条件字符串类型(string)相等规定只要长度相等,且各位字符对应相等strings1=“teen”,s2=“age”,s3=“teenage”;s3==s1//falses3==s1+s2//true、、=、=整数类型、实数类型、枚举类型默认情况下不能作用于引用类型string1=“teen”,s2=“teenage”;s1.Lengths2.Length//trues1s2//错float与double类型,比较时要考虑无穷大和非数字情况一般实数都小于正无穷,大于负无穷NaN不等于任何值两个NaN值也被认为互不相等类型判断C#类型转换不一定总是成功,这种情况在编译时一般不会被检查出来,可能会在程序执行时引发异常通常可以在转换前进行类理判断书写格式:eisT(实例对象是某种类型吗?)e要求是一个变量或表达式(结果是某类型实例)右操作数T要求本身是一个类型intx;xisint;//truexisobject;//truexisshort;//falsexislong;//falsexisstring;//false当e为值类型,表达式eisT的结果在编译时就能确定,C#编译器会给出警告当e为引用类型的变量,如果e的值为nulleisT始终返回false当e的值不为空,假设e实际类型为E当E是T的派生类时表达式”eisT”返回true否则返回falseT可以是类,也可以是接口P68例P4_7条件逻辑表达式逻辑操作符主要用于连接多个比较表达式,从而构成复合条件表达式,表示复杂条件&&||!逻辑操作符只作用于布尔类型的操作数,且返回值总是布尔类型。逻辑运算规则P90if(w1==Weekday.Saturday||w1==Weekday.SunDay)//周末吗if((year%400)==0||(year%4)==0&&(year%100)!=0))//是闰年吗逻辑表达式“短路”对于a&&ba为true,继续求解ba为false,表达式确定为false,不再求解b对于a||b只有当a为false时,才继续求解表达当a为true,表达式确定为true,不再考虑b的情况可利用“短路”效应,提高程序运行效率较简单、较易计算的表达式可以写在较前位置其它特殊表达式一元加减表达式+-表示数值的正负号一元加号不改变操作数的值,一般不用操作数类型:int、uint、long、ulong,float、double,decimalintx1=+2;//x1=2一元减号取操作数相反数操作数类型比加号少一个ulongintx2=-x1;//x2=-2;byte、short等类型的变量,在一元加减操作前都会隐式转换到int类型,返回值也是int类型。一元减号操作作用于uint时,返回longuintx1=10;longx2=-(-x1);uintx3=(uint)(-(-x1));有符号整型的MinValue的绝对值总是比MaxValue的绝对值大1,故对相反数会溢出条件操作符C#中唯一三元操作符”?:”形如:b?e1:e2b为一个逻辑表达式b值为true,返回e1的值b值为false,返回e2的值不会对e1和e2同时求值条件表达式要求e1和e2类型兼容,结果为e1和e2中最兼容的类型.e1e2类型相同,返回该类型e1可向e2隐式转换,返回e2的类型e2可向e1隐式转换,返回e1的类型若上述条件不成立,表达式不合法,编译时错inti=49;(i%7==0)?(i/7):”不能整除”);//错条件操作符具有右结合性(右关联性)a?b:c?d:e-a?b:(c?d:e)闰年判断:boolleap=(year%400==0)?true:(year%100==0)?false:(year%4==0)?true:false;类型转换表达式显示转换(T)一元前缀操作符intx=3;shortx2=(short)x1;strings1=“Microsoft”;objecto1=(object)s1;二元类型转换操作符as左操作数是一个变量或表达式(结果是某类型实例对象)右操作数是一个类型只能进行引用类型的转换或装箱转换,不能在两上值类型之间进行转换intx1=3;shortx2=x1asshort;//错从基类到派生类进行转换,显示转换不保证总是成功BankCardc1=newCreditCard();Bankcardc2=newBankcard();CreditCardc3=(CreditCard)c1;CreditCardc4=(CreditCard)c2;//类型转换失败as操作符在很大程度上就是用于解决这一问题的.转换成功,表达式返回的结果相当于(T);转换失败,表达式返回空值nullCreditCardc3=c1asCreditCard;//c3=c1CreditCardc4=c2asCreditCard;//c4=null创建表达式new操作符用于创建类型的实例或对象创建表达式newT()T是一个类型(结构,类)如果对象还没有被初始化,new创建对象并为其分配内存intx1=newInt32();//结构BankCardc=newBankCard();//类newT()返回一个新建的T型对象,若对变量赋值,效果取决于变量类型新建结构对象赋值给结构(值类型)变量时,变量中原有内容替换为新对象,原值丢失新建的类对象赋值给一个类(引用类型)变量时,变量指向新对象.如果对象不再使用,它会被.NET运行时动态回收。例P4_9溢出检查表达式用于控制对程序中算术运算和类型转换的溢出检查,checkedunchecked如果不加声明,默认对常量表达式进行溢出检查(出错,不能通过编译),而对非常量表达式不进行溢出检查checked操作符强制对表达式进行类型检查byteb1=(byte)256;//默认为checked,检查错误byteb2=checked(255+1);//检查错误对于非常量表达式,代码总是能够通过编译,但执行时会发生”System.OverflowException”异常byteb1=255;byteb2=checked(b1+1);//运行时异常unchedked操作符表示不对表达式进行溢出检查。如果运算发生溢出,超出部分将被截断。不再产生异常。inti1=int.MaxValue;//2147483647inti2=unchecked(i1+1);//-2147483648byteb1=unchecked((byte)256);//合法,b1=0byteb2=255;byteb3=(byte)(b2+1);//可编译通过,但运行时异常习题4P961(1)x/y+(int)x/y-(int)x/y1(4)intz=(x++%y==0)?++x:(x/y==1)?++y:--y;intz=(x++%y==0)?++x:((x/y==1)?++y:--y);1(5)intx=-5;x-(x2)
本文标题:第四章操作符和表达式
链接地址:https://www.777doc.com/doc-3648234 .html