《ch 运算符和表达式.pptx》由会员分享,可在线阅读,更多相关《ch 运算符和表达式.pptx(45页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1运算符根据运算符的操作数的个数不同,可将其分为单目(一元):对一个操作数运算双目(二元):对二个操作数运算三目(三元):对三个操作数运算P.580 表E.1C+常用运算符一览表第2页/共45页第1页/共45页优先级优先级操作符操作符结合性结合性1:左左右右2.-()左左右右3+-!-+&*sizeof new delete (类型类型)右右左左4.*-*左左右右5*/%左左右右6+-左左右右7左左右右8 =左左右右9=!=左左右右10&左左右右11左左右右12|左左右右13&左左右右14|左左右右15?:右右左左16=*=/=+=-=|=%=&=&=|=右右左左17,左左右右C+操作符的优先
2、级与结合性操作符的优先级与结合性第3页/共45页第2页/共45页3目录3.1算术运算3.2赋值运算3.3sizeof运算符3.4逗号运算符3.5自增和自减3.6位运算第4页/共45页第3页/共45页43.1 算术运算数学中,算术运算包括加、减、乘、除、乘方及开方等。在C+中,算术运算是由算术运算符或库函数实现的。P.576 常用的C+库函数及类库第5页/共45页第4页/共45页5算术运算符的优先级和结合性优先级优先级运算符运算符描述描述目数目数结合性结合性3+正号正号单目单目从右至左从右至左-负号负号5*乘法乘法双目双目从左至右从左至右/除法除法%取余取余6+加法加法-减法减法第6页/共45页
3、第5页/共45页63.1.1 算术运算符(1)除法运算“/”,两个整数相除,结果为整数,否则为实数。(2)求余运算“%”,要求参与运算的两个操作数都是整型,其结果是两个数相除的余数。(3)负值的求余运算结果的符号与运算符左边的操作数的符号一致。5/-2=-22/-3=05/2.0=2.5(float)5/2=2.55%-2=1-5%2=-12%-3=2-2%-3=-2第7页/共45页第6页/共45页73.1.2 优先级和结合性单目运算符的优先级最高,其次是乘、除和求余,最后是加、减。运算符的结合性是指运算符和操作数的结合方式,它有从左至右和从右至左两种。只有当两个同级运算符共用一个操作数时,结
4、合性才会起作用。例如:c-a+b操作数a的两边的运算符相同,则先进行c-a操作除1目、3目、赋值运算符外的操作符的结合性均是从左到右。第8页/共45页第7页/共45页83.1.3 数据类型转换C+采用两种方法对数据类型进行转换:一种是自动转换;另一种是强制转换。自动转换是将数据类型按从低到高的顺序自动进行转换,由于这种转换不会丢失有效的数据位,因而是安全的。强制转换是在程序中通过指定数据类型来改变,将一个变量从其定义的类型人为地改变成为另一种类型。由于这种转换可能会丢失有效的数据位,因而是不安全的。()()第9页/共45页第8页/共45页9类型转换的顺序整型整型(int)无符号长整型无符号长整
5、型(unsigned long)长整型长整型(long)无符号整型无符号整型(unsigned)短整型短整型,字符型字符型(short,char)双精度实型双精度实型(double)单精度实型单精度实型(float)长双精度实型长双精度实型(long double)第10页/共45页第9页/共45页101.自动转换字符型、整型、实型之间可以进行混合运算,其中字符型数据以ASC码的十进制数参与运算。运算时,不同类型的数据要先转换成同一类型,然后进行运算。转换规则:类型转换由系统自动完成。转换总是朝表达数据能力更强的方向,并且转换总是逐个运算符进行的。例如:inti=10;longl=4;floa
6、tf=5.0;doubled=1.25;则:i+a+2*d-f/l运算结果为double型的108.25第11页/共45页第10页/共45页112.强制转换 功能:将一个表达式的值转换成某个类型格式:(类型名)(表达式)说明:括号必须,但是,如果表达式是单个操作数,其括号可以省。例如:(int)x(int)(x+y)一般,系统对操作数自动进行类型转换,但如果:a%b要求a和b都是整型,如果不是,必须先进行转换:(int)a%b(int)a%(int)b转换后只得到一个中间变量,被转换的变量的类型不变。第12页/共45页第11页/共45页123.1.4 代数式和表达式为了能让C程序进行数值计算,
7、还必须将代数式写合法的C表达式。(1)注意书写规范(2)注意加圆括号(3)注意数据类型(4)注意符号第13页/共45页第12页/共45页133.1算术运算3.2赋值运算3.3sizeof运算符3.4逗号运算符3.5自增和自减3.6位运算第14页/共45页第13页/共45页143.2 赋值运算符在C+中,赋值运算是使用赋值运算符“=”来操作的,它是使用最多的双目运算符。赋值运算符“=”的作用是将赋值符右边操作数的值存储到左边操作数所在的内存空间。赋值符“=”左边的操作数必须是左值。赋值表达式的值和类型是左值的值和类型。第15页/共45页第14页/共45页153.2.1 左值和右值左值(L-val
8、ue):能出现在赋值表达式左边的表达式。左值表达式具有存放数据的空间,并且存放是允许的。例如:inta=3;右值:只能出现在赋值表达式右边的表达式。例如:inta;constintb=6;a=b+8;/a是左值,b+8为右值b=8;/error,b是常量,只能作右值(a=4)=8;/a=4是左值表达式,可以被赋值32=a+2;/error,32是常量,只能作右值第16页/共45页第15页/共45页163.2.2 数值截取和数值溢出赋值表达式的值和类型是左值的值和类型。在赋值表达式中,当右值的数据类型低于左值的数据类型时,C+会自动进行数据类型的转换。若右值的数据类型高于左值的数据类型且不超过左
9、值的范围时,C+会自动进行数值截取。如果一个数值超出一个数据类型所表示的数据范围,则会出现数值溢出。第17页/共45页第16页/共45页17溢出进行算术运算时,很可能溢出结果。发生溢出是由于一个变量被赋予一个超出其数据类型表示范围的数值。数值溢出不会引起编译错误,只要分母不为0就不会引起除0运行故障,但会使运行结果发生偏差。例如:shortintweight=42896;coutweightendl;得到的结果是42896的补码(-22640)即:42896-65536=-22640第18页/共45页第17页/共45页18例Ex_OverFlow 一个整型溢出的例子1.#include2.us
10、ingnamespacestd;3.intmain()4.5.shortnTotal,nNum1,nNum2;6.nNum1=1000;nNum2=1000;7.nTotal=nNum1*nNum2;8.coutnTotaln;9.return0;10.第19页/共45页第18页/共45页193.2.3 复合赋值算术运算算术运算+=加赋值加赋值-=减赋值减赋值*=乘赋值乘赋值/=除赋值除赋值%=求余赋值求余赋值位运算位运算&=位与赋值位与赋值|=位或赋值位或赋值=位异或赋位异或赋值值=右移位赋右移位赋值值第20页/共45页第19页/共45页203.2.3 复合赋值10种复合赋值运算符都是在赋值
11、符“=”之前加上其他运算符而构成的。在复合赋值运算符之间不能有空格。复合运算符的优先级和赋值符的优先级一样,在C+的所有运算符中只高于逗号运算符,而且复合赋值运算符的结合性也和赋值符一样,是从右至左。第21页/共45页第20页/共45页213.2.4 多重赋值多重赋值是指在一个赋值表达式中出现两个或更多的赋值符“=”。赋值表达式几乎可以出现在程序的任何地方,由于赋值运算符的等级比较低,因此这时的赋值表达式两边要加上圆括号。第22页/共45页第21页/共45页223.1算术运算3.2赋值运算3.3sizeof运算符3.4逗号运算符3.5自增和自减3.6位运算第23页/共45页第22页/共45页2
12、33.3 sizeof运算符sizeof运算符的目的是返回操作数所占的内存空间大小(字节数)由于同一类型的操作数在不同的计算机中占用的存储字节数可能不同,因此sizeof运算的结果有可能不一样。sizeofsizeof()sizeofsizeof()第24页/共45页第23页/共45页243.1算术运算3.2赋值运算3.3sizeof运算符3.4逗号运算符3.5自增和自减3.6位运算第25页/共45页第24页/共45页253.4 逗号运算符逗号运算符,把多个表达式连接起来,构成一个逗号表达式在计算时,C+将从左至右逐个计算每个表达式,最终整个表达式的结果是最后计算的那个表达式的类型和值,即表达
13、式n的类型和值。逗号运算符“,”的优先级是最低的,必要时注意加圆括号,以使逗号表达式的运算次序先于其他表达式。表达式表达式表达式表达式1,1,表达式表达式表达式表达式2,2,表达式表达式表达式表达式3,3,表达式表达式表达式表达式n n第26页/共45页第25页/共45页263.4 逗号运算符例:如果a=5,表达式a=3*5,a*4的值为即:a=3*5,a*4注意:表达式a=3*5,a*4与a=(3*5,a*4)的区别例:如果a=5,表达式a=(3*5,a*4)的值为逗号表达式可以嵌套:例:如果a=5,表达式(a=3*5,a*4),a+5的值为即:a=3*5,a*4这时的a=15所以:a+5就
14、等于206020第27页/共45页第26页/共45页273.1算术运算3.2赋值运算3.3sizeof运算符3.4逗号运算符3.5自增和自减3.6位运算第28页/共45页第27页/共45页283.5 自增和自减单目运算符自增(+)和自减(-)为左值加1或减1提供一种非常有效的方法。自增(+)和自减(-)运算符既可放在左值的左边,也可以出现在左值的右边,分别称为前缀运算符和后缀运算符。前缀运算符、后缀运算符和其他的运算符组合在一起,在求值次序上就会产生根本不同。第29页/共45页第28页/共45页29自增:+i:先加1后使用i+:先使用后加1例:i=3;j1=+i;j1=4相当于执行:i=i+1
15、;j1=i;j2=i+;j2=3相当于执行:j2=i;i=i+1;自减:-i:先减1后使用i-:先使用后减1例:i=3;j1=-i;j1=2相当于执行:i=i-1;j1=i;j2=i-;j2=3相当于执行:j2=i;i=i-1;3.5.1 一般用法第30页/共45页第29页/共45页303.5.2 前缀和后缀的区别由于前增量操作返回的值即修改之后的变量值,所以返回的仍然是一个左值。例如:inta=3;+(+a);/ok:+a是左值。a的值是5由于后增量操作返回的值是原先a的值,而后a的值已经发生变化,故返回的不能是当前a,只能是过去的a值,不能是左值。例如:inta=3;+(a+);/erro
16、r:a+不是左值第31页/共45页第30页/共45页313.5.3注意事项(1)前缀自增或自减表达式的结果仍为一个左值,而后缀自增或自减表达式的结果不是左值。对于等级相同的单目运算符来说,哪一个运算符靠近操作数,就和哪个运算符先结合。(2)自增或自减运算符是两个“+”或两个“-”的一个整体,中间不能有空格。如果有多于两个“+”或两个“-”连写的情况,编译时会首先识别自增或自减运算符。(3)在有自增或自减运算符的混合运算中,一要注意次序,二要注意左值对应于一块内存空间这个特性(4)在cout语句中的自增或自减运算中,不同编译器的处理方式也是不一样的。第32页/共45页第31页/共45页32操作符
17、的识别编译器采用贪吃法则如果有多于两个+或两个-连写的情况,则编译首先识别前面两个+或-为增量或减量操作符。inta=3,b=5,c;c=a+b;/ok;c=a+b;/错:理解为a+bc=a+b;/ok:a+bc=a+b;/错:理解为a+bc=a+b;/错:理解为a+b第33页/共45页第32页/共45页333.1算术运算3.2赋值运算3.3sizeof运算符3.4逗号运算符3.5自增和自减3.6位运算第34页/共45页第33页/共45页343.6 位运算运算符运算符描述描述位逻辑运位逻辑运算算按位求反按位求反,单目单目&按位与按位与,双目双目按位异或按位异或,双目双目|按位或按位或,双目双目
18、移位运算移位运算右移右移,双目双目高位补高位补0或符号或符号位,位,第35页/共45页第34页/共45页353.6.1 位逻辑运算位与操作&将两个操作数每一位做与操作shorta=12;/00001100shortb=6;/00000110c=a&b;/00000100=4,比较a&b位或操作|将两个操作数每一位做或操作inta=12;/00001100intb=6;/00000110c=a|b为/00001110=14,比较a|b第36页/共45页第35页/共45页363.6.1 位逻辑运算位异或操作将两个操作数每一位做异或操作。若两个操作数相等,值为0;若两个操作数不等,值为1。inta=
19、12;/00001100intb=6;/00000110c=ab;/00001010=10位反操作将一个操作数的每一位取反,0变1,1变0。inta=12;/00001100b=a/11110011第37页/共45页第36页/共45页37左移操作将整数最高位挤掉,在右端补0。inta=12;/00001100a=a对于有符号数,若最高位是1,则高位挤进去1;最高位是0,则高位挤进去0;对于无符号数,则一律高位挤进去0;shortinta=-2;/1111111111111110a=a1;/1111111111111111=-1unsignedshortintb=65535;/111111111
20、1111111b=b1;/0111111111111111=327673.6.2 移位运算第38页/共45页第37页/共45页38例Ex_BitOP 位运算实例1.#include2.#include3./由于后面用到setw格式算子,故添加此头文件4.usingnamespacestd;5.voidout2(unsignedn)6./定义一个函数,将一个无符号整型数n按二进制数输出7.8.unsignednBits=sizeof(n)*8;/计算一个整型变量所占的位数9.while(nBits0)10.11.cout(nBits-1)&1);/先向右移位再按位与12.nBits-;13.14
21、.cout【n】endl;15.第39页/共45页第38页/共45页391.intmain()2.3.unsignedbits=sizeof(unsigned)*8;4.cout本机无符号整型的位数为:bitsendl;5.cout;6.out2(1234);/调用函数7.cout;8.coutsetw(bits)endl;9./setw用来设置下一个对象的输出宽度10.cout;11.out2(7);/调用函数12.cout;13.coutsetw(bits)-endl;14.cout=;15.out2(12347);/调用函数16.return0;17.例Ex_BitOP 位运算实例第40页/共45页第39页/共45页40程序运行结果如下:第41页/共45页第40页/共45页413.6.3 位运算的应用位运算常用来测试某位,或将某位置1、清零或取反等。第42页/共45页第41页/共45页42小结运算符表达式算术表达式赋值表达式逗号表达式第43页/共45页第42页/共45页43实验2(P.495)数据类型、运算符和表达式第44页/共45页第43页/共45页44作业P.501,2(4)(5)(6)(7),4,5,9第45页/共45页第44页/共45页C+实用教程45感谢您的观赏!第45页/共45页
限制150内