《第三章 运算符和表达式(精品).ppt》由会员分享,可在线阅读,更多相关《第三章 运算符和表达式(精品).ppt(46页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第3章 运算符和表达式2023/1/26表达式在在C+中,中,运算符运算符和和表达式表达式是实现数据操是实现数据操作的两个重要组成部分。作的两个重要组成部分。表达式表达式是由变量、常量、函数等通过一个是由变量、常量、函数等通过一个或多个运算符组合而成的式子。或多个运算符组合而成的式子。表达式中,变量、常量、函数等都是运算表达式中,变量、常量、函数等都是运算符的运算对象,称为符的运算对象,称为操作数操作数。例:例:(2*x+a)*sin(b)-202C+实用教程运算符根据运算符的操作数的个数不同,可将其根据运算符的操作数的个数不同,可将其分为分为单目(一元):对一个操作数运算单目(一元):对一个
2、操作数运算双目(二元):对二个操作数运算双目(二元):对二个操作数运算三目(三元):对三个操作数运算三目(三元):对三个操作数运算P.580表表E.1C+常用运算符一览表常用运算符一览表3C+实用教程优先级优先级操作符操作符结合性结合性1:左左右右2.-()左左右右3+-!-+&*sizeofnewdelete(类型类型)右右左左4.*-*左左右右5*/%左左右右6+-左左右右7左左右右8=左左右右9=!=左左右右10&左左右右11左左右右12|左左右右13&左左右右14|左左右右15?:右右左左16=*=/=+=-=|=%=&=&=|=右右左左17,左左右右C+操作符的优先级与结合性操作符的
3、优先级与结合性4C+实用教程目录3.1算术运算算术运算3.2赋值运算赋值运算3.3sizeof运算符运算符3.4逗号运算符逗号运算符3.5自增和自减自增和自减3.6位运算位运算5C+实用教程3.1 算术运算数学中,算术运算包括加、减、乘、除、数学中,算术运算包括加、减、乘、除、乘方及开方等。乘方及开方等。在在C+中,算术运算是由算术运算符或库中,算术运算是由算术运算符或库函数实现的。函数实现的。P.576常用的常用的C+库函数及类库库函数及类库6C+实用教程算术运算符的优先级和结合性优先级优先级运算符运算符描述描述目数目数结合性结合性3+正号正号单目单目从右至左从右至左-负号负号5*乘法乘法双
4、目双目从左至右从左至右/除法除法%取余取余6+加法加法-减法减法7C+实用教程3.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
5、=-28C+实用教程3.1.2 优先级和结合性单目运算符的优先级最高,其次是乘、除单目运算符的优先级最高,其次是乘、除和求余,最后是加、减。和求余,最后是加、减。运算符的运算符的结合性结合性是指运算符和操作数的结是指运算符和操作数的结合方式,它有从左至右和从右至左两种。合方式,它有从左至右和从右至左两种。只有当两个同级运算符共用一个操作数时,结只有当两个同级运算符共用一个操作数时,结合性才会起作用。合性才会起作用。例如:例如:c-a+b操作数操作数a的两边的运算符相同,则先进行的两边的运算符相同,则先进行c-a操作操作除除1目、目、3目、赋值运算符外的操作符的结合性目、赋值运算符外的操作符的结
6、合性均是从左到右。均是从左到右。9C+实用教程3.1.3 数据类型转换C+采用两种方法对数据类型进行转换:一种采用两种方法对数据类型进行转换:一种是是自动转换自动转换;另一种是;另一种是强制转换强制转换。自动转换是将数据类型按从低到高的顺序自动进行自动转换是将数据类型按从低到高的顺序自动进行转换,由于这种转换不会丢失有效的数据位,因而转换,由于这种转换不会丢失有效的数据位,因而是是安全安全的。的。强制转换是在程序中通过指定数据类型来改变,将强制转换是在程序中通过指定数据类型来改变,将一个变量从其定义的类型人为地改变成为另一种类一个变量从其定义的类型人为地改变成为另一种类型。由于这种转换可能会丢
7、失有效的数据位,因而型。由于这种转换可能会丢失有效的数据位,因而是是不安全不安全的。的。()()10C+实用教程类型转换的顺序整型整型(int)无符号长整型无符号长整型(unsignedlong)长整型长整型(long)无符号整型无符号整型(unsigned)短整型短整型,字符型字符型(short,char)双精度实型双精度实型(double)单精度实型单精度实型(float)长双精度实型长双精度实型(longdouble)11C+实用教程1.自动转换字符型、整型、实型之间可以进行混合运算,其字符型、整型、实型之间可以进行混合运算,其中字符型数据以中字符型数据以ASC码的十进制数参与运算。码的
8、十进制数参与运算。运算时,不同类型的数据要先转换成同一类型,运算时,不同类型的数据要先转换成同一类型,然后进行运算。然后进行运算。转换规则:转换规则:类型转换由系统自动完成。转换总是朝表达数据能力类型转换由系统自动完成。转换总是朝表达数据能力更强的方向,并且转换总是逐个运算符进行的。更强的方向,并且转换总是逐个运算符进行的。例如:例如:inti=10;longl=4;floatf=5.0;doubled=1.25;则:则:i+a+2*d-f/l运算结果为运算结果为double型的型的108.2512C+实用教程2.强制转换 功能:将一个表达式的值转换成某个类型功能:将一个表达式的值转换成某个类
9、型格式:格式:(类型名类型名)(表达式表达式)说明:说明:括号必须,但是,如果表达式是单个操作数,其括号括号必须,但是,如果表达式是单个操作数,其括号可以省。可以省。例如:例如:(int)x(int)(x+y)一般,系统对操作数自动进行类型转换,但如果:一般,系统对操作数自动进行类型转换,但如果:a%b要求要求a和和b都是整型,如果不是,必须先进行转换:都是整型,如果不是,必须先进行转换:(int)a%b(int)a%(int)b转换后只得到一个中间变量,被转换的变量的类型不转换后只得到一个中间变量,被转换的变量的类型不变。变。13C+实用教程3.1.4 代数式和表达式为了能让为了能让C程序进
10、行数值计算,还必须程序进行数值计算,还必须将代数式写合法的将代数式写合法的C表达式。表达式。(1)注意书写规范)注意书写规范(2)注意加圆括号)注意加圆括号(3)注意数据类型)注意数据类型(4)注意符号)注意符号14C+实用教程3.1算术运算算术运算3.2赋值运算赋值运算3.3sizeof运算符运算符3.4逗号运算符逗号运算符3.5自增和自减自增和自减3.6位运算位运算15C+实用教程3.2 赋值运算符在在C+中,赋值运算是使用赋值运算符中,赋值运算是使用赋值运算符“=”来操作的,它是使用最多的双目运算符。来操作的,它是使用最多的双目运算符。赋值运算符赋值运算符“=”的作用是将赋值符右边操作的
11、作用是将赋值符右边操作数的值存储到左边操作数所在的内存空间。数的值存储到左边操作数所在的内存空间。赋值符赋值符“=”左边的操作数必须是左边的操作数必须是左值左值。赋值表达式的值和类型是左值的值和类型。赋值表达式的值和类型是左值的值和类型。16C+实用教程3.2.1 左值和右值左值(左值(L-value):能出现在赋值表达式左边的表):能出现在赋值表达式左边的表达式。左值表达式具有存放数据的空间,并且存达式。左值表达式具有存放数据的空间,并且存放是允许的。放是允许的。例如:例如:inta=3;右值:只能出现在赋值表达式右边的表达式。右值:只能出现在赋值表达式右边的表达式。例如:例如:inta;c
12、onstintb=6;a=b+8;/a是左值,是左值,b+8为右值为右值b=8;/error,b是常量,只能作右值是常量,只能作右值(a=4)=8;/a=4是左值表达式,可以被赋值是左值表达式,可以被赋值32=a+2;/error,32是常量,只能作右值是常量,只能作右值17C+实用教程3.2.2 数值截取和数值溢出赋值表达式的值和类型是左值的值和类型。赋值表达式的值和类型是左值的值和类型。在赋值表达式中,当右值的数据类型低于在赋值表达式中,当右值的数据类型低于左值的数据类型时,左值的数据类型时,C+会自动进行数据类会自动进行数据类型的转换。型的转换。若右值的数据类型高于左值的数据类型且若右值
13、的数据类型高于左值的数据类型且不超过左值的范围时,不超过左值的范围时,C+会自动进行会自动进行数值数值截取截取。如果一个数值超出一个数据类型所表示的如果一个数值超出一个数据类型所表示的数据范围,则会出现数据范围,则会出现数值溢出数值溢出。18C+实用教程溢出进行算术运算时,很可能溢出结果。发生进行算术运算时,很可能溢出结果。发生溢出是由于一个变量被赋予一个超出其数溢出是由于一个变量被赋予一个超出其数据类型表示范围的数值。据类型表示范围的数值。数值溢出不会引起编译错误,只要分母不数值溢出不会引起编译错误,只要分母不为为0就不会引起除就不会引起除0运行故障,但会使运行运行故障,但会使运行结果发生偏
14、差。结果发生偏差。例如:例如:shortintweight=42896;coutweightendl;得到的结果是得到的结果是42896的补码(的补码(-22640)即:即:42896-65536=-2264019C+实用教程例Ex_OverFlow 一个整型溢出的例子1.#include2.usingnamespacestd;3.intmain()4.5.shortnTotal,nNum1,nNum2;6.nNum1=1000;nNum2=1000;7.nTotal=nNum1*nNum2;8.coutnTotaln;9.return0;10.20C+实用教程3.2.3 复合赋值算术运算算术
15、运算+=加赋值加赋值-=减赋值减赋值*=乘赋值乘赋值/=除赋值除赋值%=求余赋值求余赋值位运算位运算&=位与赋值位与赋值|=位或赋值位或赋值=位异或赋位异或赋值值=右移位赋右移位赋值值21C+实用教程3.2.3 复合赋值10种复合赋值运算符都是在赋值符种复合赋值运算符都是在赋值符“=”之之前加上其他运算符而构成的。前加上其他运算符而构成的。在复合赋值运算符之间不能有空格。在复合赋值运算符之间不能有空格。复合运算符的优先级和赋值符的优先级一复合运算符的优先级和赋值符的优先级一样,在样,在C+的所有运算符中只高于逗号运算的所有运算符中只高于逗号运算符,而且复合赋值运算符的结合性也和赋符,而且复合赋
16、值运算符的结合性也和赋值符一样,是值符一样,是从右至左从右至左。22C+实用教程3.2.4 多重赋值多重赋值是指在一个赋值表达式中出现两多重赋值是指在一个赋值表达式中出现两个或更多的赋值符个或更多的赋值符“=”。赋值表达式几乎可以出现在程序的任何地赋值表达式几乎可以出现在程序的任何地方,由于赋值运算符的等级比较低,因此方,由于赋值运算符的等级比较低,因此这时的赋值表达式两边要加上圆括号。这时的赋值表达式两边要加上圆括号。23C+实用教程3.1算术运算算术运算3.2赋值运算赋值运算3.3sizeof运算符运算符3.4逗号运算符逗号运算符3.5自增和自减自增和自减3.6位运算位运算24C+实用教程
17、3.3 sizeof运算符sizeof运算符的目的是返回操作数所占的内运算符的目的是返回操作数所占的内存空间大小(字节数)存空间大小(字节数)由于同一类型的操作数在不同的计算机中占用由于同一类型的操作数在不同的计算机中占用的存储字节数可能不同,因此的存储字节数可能不同,因此sizeof运算的结运算的结果有可能不一样。果有可能不一样。sizeofsizeof()sizeofsizeof()25C+实用教程3.1算术运算算术运算3.2赋值运算赋值运算3.3sizeof运算符运算符3.4逗号运算符逗号运算符3.5自增和自减自增和自减3.6位运算位运算26C+实用教程3.4 逗号运算符逗号运算符,把多
18、个表达式连接起来,构逗号运算符,把多个表达式连接起来,构成一个逗号表达式成一个逗号表达式在计算时,在计算时,C+将从左至右逐个计算每个表达将从左至右逐个计算每个表达式,最终整个表达式的结果是最后计算的那个式,最终整个表达式的结果是最后计算的那个表达式的类型和值,即表达式表达式的类型和值,即表达式n的类型和值。的类型和值。逗号运算符逗号运算符“,”的优先级是最低的,必要时注的优先级是最低的,必要时注意加圆括号,以使逗号表达式的运算次序先于意加圆括号,以使逗号表达式的运算次序先于其他表达式。其他表达式。表达式表达式表达式表达式1,1,表达式表达式表达式表达式2,2,表达式表达式表达式表达式3,3,
19、表达式表达式表达式表达式n n27C+实用教程3.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就等于就等于20602028C+实用教程3.1算术运算算术运算3.2赋值运算赋值运算3.3sizeof运算符运算
20、符3.4逗号运算符逗号运算符3.5自增和自减自增和自减3.6位运算位运算29C+实用教程3.5 自增和自减单目运算符自增(单目运算符自增(+)和自减()和自减(-)为)为左值左值加加1或减或减1提供一种非常有效的方法。提供一种非常有效的方法。自增(自增(+)和自减()和自减(-)运算符既可放在左运算符既可放在左值的左边,也可以出现在左值的右边,分值的左边,也可以出现在左值的右边,分别称为别称为前缀运算符前缀运算符和和后缀运算符后缀运算符。前缀运算符、后缀运算符和其他的运算符组合前缀运算符、后缀运算符和其他的运算符组合在一起,在求值次序上就会产生根本不同。在一起,在求值次序上就会产生根本不同。3
21、0C+实用教程自增:自增:+i:先加先加1后使用后使用i+:先使用后加先使用后加1例:例:i=3;j1=+i;j1=4相当于执行:相当于执行:i=i+1;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 一般用法31C+实用教程3.5.2 前缀和后缀的区别由于前增量操作返回的值即修改之后的变量值,由于前增量操作返回的值即修改之后的变量值,所
22、以返回的仍然是一个左值。例如:所以返回的仍然是一个左值。例如:inta=3;+(+a);/ok:+a是左值。是左值。a的值是的值是5由于后增量操作返回的值是原先由于后增量操作返回的值是原先a的值,而后的值,而后a的的值已经发生变化,故返回的不能是当前值已经发生变化,故返回的不能是当前a,只能是只能是过去的过去的a值,不能是左值。例如:值,不能是左值。例如:inta=3;+(a+);/error:a+不是左值不是左值32C+实用教程3.5.3注意事项(1)前缀自增或自减表达式的结果仍为一个左值,)前缀自增或自减表达式的结果仍为一个左值,而后缀自增或自减表达式的结果不是左值。对于而后缀自增或自减表
23、达式的结果不是左值。对于等级相同的单目运算符来说,哪一个运算符靠近等级相同的单目运算符来说,哪一个运算符靠近操作数,就和哪个运算符先结合。操作数,就和哪个运算符先结合。(2)自增或自减运算符是两个)自增或自减运算符是两个“+”或两个或两个“-”的一个整体,中间不能有空格。如果有多于两个的一个整体,中间不能有空格。如果有多于两个“+”或两个或两个“-”连写的情况,编译时会首先识别连写的情况,编译时会首先识别自增或自减运算符。自增或自减运算符。(3)在有自增或自减运算符的混合运算中,一要)在有自增或自减运算符的混合运算中,一要注意次序,二要注意左值对应于一块内存空间这注意次序,二要注意左值对应于一
24、块内存空间这个特性个特性(4)在)在cout语句中的自增或自减运算中,不同编语句中的自增或自减运算中,不同编译器的处理方式也是不一样的。译器的处理方式也是不一样的。33C+实用教程操作符的识别编译器采用贪吃法则编译器采用贪吃法则如果有多于两个如果有多于两个+或两个或两个-连写的情况,则编译连写的情况,则编译首先识别前面两个首先识别前面两个+或或-为增量或减量操作符。为增量或减量操作符。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+b34C+实用教程3.1算术
25、运算算术运算3.2赋值运算赋值运算3.3sizeof运算符运算符3.4逗号运算符逗号运算符3.5自增和自减自增和自减3.6位运算位运算35C+实用教程3.6 位运算运算符运算符描述描述位逻辑运位逻辑运算算按位求反按位求反,单目单目&按位与按位与,双目双目按位异或按位异或,双目双目|按位或按位或,双目双目移位运算移位运算右移右移,双目双目高位补高位补0或符号或符号位,位,36C+实用教程3.6.1 位逻辑运算位与操作位与操作&将两个操作数每一位做与操作将两个操作数每一位做与操作shorta=12;/00001100shortb=6;/00000110c=a&b;/00000100=4,比较,比较
26、a&b位或操作位或操作|将两个操作数每一位做或操作将两个操作数每一位做或操作inta=12;/00001100intb=6;/00000110c=a|b为为/00001110=14,比较,比较a|b37C+实用教程3.6.1 位逻辑运算位异或操作位异或操作将两个操作数每一位做异或操作。若两个操作将两个操作数每一位做异或操作。若两个操作数相等,值为数相等,值为0;若两个操作数不等,值为;若两个操作数不等,值为1。inta=12;/00001100intb=6;/00000110c=ab;/00001010=10位反操作位反操作将一个操作数的每一位取反,将一个操作数的每一位取反,0变变1,1变变0
27、。inta=12;/00001100b=a/1111001138C+实用教程左移操作左移操作将整数最高位挤掉,在右端补将整数最高位挤掉,在右端补0。inta=12;/00001100a=a对于有符号数,若最高位是对于有符号数,若最高位是1,则高位挤进去,则高位挤进去1;最高;最高位是位是0,则高位挤进去,则高位挤进去0;对于无符号数,则一律高位挤进去对于无符号数,则一律高位挤进去0;shortinta=-2;/1111111111111110a=a1;/1111111111111111=-1unsignedshortintb=65535;/1111111111111111b=b1;/01111
28、11111111111=327673.6.2 移位运算39C+实用教程例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);/
29、先向右移位再按位与先向右移位再按位与12.nBits-;13.14.cout【n】endl;15.40C+实用教程1.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 位运算实例41C+实用教程程序运行结果如下:42C+实用教程3.6.3 位运算的应用位运算常用来测试某位,或将某位置位运算常用来测试某位,或将某位置1、清、清零或取反等。零或取反等。43C+实用教程小结运算符运算符表达式表达式算术表达式算术表达式赋值表达式赋值表达式逗号表达式逗号表达式44C+实用教程实验2(P.495)数据类型、运算符和表达式数据类型、运算符和表达式45C+实用教程作业P.501,2(4)(5)(6)(7),4,5,946C+实用教程
限制150内