ch03运算符和表达式

上传人:san****019 文档编号:71475756 上传时间:2019-01-20 格式:PPT 页数:48 大小:647.81KB
返回 下载 相关 举报
ch03运算符和表达式_第1页
第1页 / 共48页
ch03运算符和表达式_第2页
第2页 / 共48页
ch03运算符和表达式_第3页
第3页 / 共48页
ch03运算符和表达式_第4页
第4页 / 共48页
ch03运算符和表达式_第5页
第5页 / 共48页
点击查看更多>>
资源描述

《ch03运算符和表达式》由会员分享,可在线阅读,更多相关《ch03运算符和表达式(48页珍藏版)》请在金锄头文库上搜索。

1、2019年1月20日星期日,第3章 运算符和表达式,C+实用教程,2,表达式,在C+中,运算符和表达式是实现数据操作的两个重要组成部分。 表达式是由变量、常量、函数等通过一个或多个运算符组合而成的式子。 表达式中,变量、常量、函数等都是运算符的运算对象,称为操作数。,例:(2*x+a)*sin(b)-20,C+实用教程,3,运算符,根据运算符的操作数的个数不同,可将其分为 单目(一元):对一个操作数运算 双目(二元):对二个操作数运算 三目(三元):对三个操作数运算 P.580 表E.1 C+常用运算符一览表,C+操作符的优先级与结合性,C+实用教程,5,目录,3.1 算术运算 3.2 赋值运

2、算 3.3 sizeof运算符 3.4 逗号运算符 3.5 自增和自减 3.6 位运算,C+实用教程,6,3.1 算术运算,数学中,算术运算包括加、减、乘、除、乘方及开方等。 在C+中,算术运算是由算术运算符或库函数实现的。 P.576 常用的C+库函数及类库,C+实用教程,7,算术运算符的优先级和结合性,C+实用教程,8,3.1.1 算术运算符,(1)除法运算“/ ” ,两个整数相除,结果为整数 ,否则为实数。 (2)求余运算“%” ,要求参与运算的两个操作数都是整型,其结果是两个数相除的余数 。 (3)负值的求余运算结果的符号与运算符左边的操作数的符号一致。 5/-2=-2 2/-3=0

3、5/2.0=2.5 (float)5/2=2.5 5%-2=1 -5%2=-1 2%-3=2 -2%-3=-2,C+实用教程,9,示例 取模运算的使用,#include using namespace std; int main() for(int i=0;i50;i+) if(i%5=0) cout“n“; couti“t“; return 0; ,C+实用教程,10,3.1.2 优先级和结合性,单目运算符的优先级最高,其次是乘、除和求余,最后是加、减。 运算符的结合性是指运算符和操作数的结合方式,它有从左至右和从右至左两种。 只有当两个同级运算符共用一个操作数时,结合性才会起作用。 例如:

4、c-a+b 操作数a的两边的运算符相同,则先进行c-a操作 除1目、3目、赋值运算符外的操作符的结合性均是从左到右。,C+实用教程,11,3.1.3 数据类型转换,C+采用两种方法对数据类型进行转换:一种是自动转换;另一种是强制转换。 自动转换是将数据类型按从低到高的顺序自动进行转换,由于这种转换不会丢失有效的数据位,因而是安全的。 强制转换是在程序中通过指定数据类型来改变,将一个变量从其定义的类型人为地改变成为另一种类型。由于这种转换可能会丢失有效的数据位,因而是不安全的。,() (),C+实用教程,12,类型转换的顺序,C+实用教程,13,1.自动转换,字符型、整型、实型之间可以进行混合运

5、算,其中字符型数据以ASC码的十进制数参与运算。 运算时,不同类型的数据要先转换成同一类型,然后进行运算。 转换规则: 类型转换由系统自动完成。转换总是朝表达数据能力更强的方向,并且转换总是逐个运算符进行的。 例如:int i=10; long l=4; float f=5.0; double d=1.25; 则:i+a+ 2*d - f/l 运算结果为double型的108.25,C+实用教程,14,2.强制转换,功能:将一个表达式的值转换成某个类型 格式:(类型名) (表达式) 说明: 括号必须有,但是,如果表达式是单个操作数,其括号可以省。 例如:(int) x (int) (x+y)

6、一般,系统对操作数自动进行类型转换,但如果: a%b 要求a和b都是整型,如果不是,必须先进行转换: (int)a%b (int)a%(int)b 转换后只得到一个中间变量,被转换的变量的类型不变。,C+实用教程,15,3.1.4 代数式和表达式,为了能让C程序进行数值计算,还必须将代数式写合法的C表达式。 (1)注意书写规范 (2)注意加圆括号 (3)注意数据类型 (4)注意符号,C+实用教程,16,3.1 算术运算 3.2 赋值运算 3.3 sizeof运算符 3.4 逗号运算符 3.5 自增和自减 3.6 位运算,C+实用教程,17,3.2 赋值运算符,在C+中,赋值运算是使用赋值运算符

7、“=”来操作的,它是使用最多的双目运算符。 赋值运算符“=”的作用是将赋值符右边操作数的值存储到左边操作数所在的内存空间。 赋值符“=”左边的操作数必须是左值 。 赋值表达式的值和类型是左值的值和类型。,C+实用教程,18,3.2.1 左值和右值,左值(L-value):能出现在赋值表达式左边的表达式。左值表达式具有存放数据的空间,并且存放是允许的。 例如: int a=3; 右值:只能出现在赋值表达式右边的表达式。 说明:左值既可以出现在赋值运算符的左边,又可以出现在右边 例如:int a;const int b=6; a=b+8; b=8; (a=4)=8; 32=a+2;,/a是左值,b

8、+8为右值 /error, b是常量,只能作右值 /a=4是左值表达式,可以被赋值 /error, 32是常量,只能作右值,C+实用教程,19,3.2.2 数值截取和数值溢出,赋值表达式的值和类型是左值的值和类型。 在赋值表达式中,当右值的数据类型低于左值的数据类型时,C+会自动进行数据类型的转换。 若右值的数据类型高于左值的数据类型且不超过左值的范围时,C+会自动进行数值截取。 如果一个数值超出一个数据类型所表示的数据范围,则会出现数值溢出。,C+实用教程,20,数值溢出,进行算术运算时,很可能溢出结果。发生溢出是由于一个变量被赋予一个超出其数据类型表示范围的数值。 数值溢出不会引起编译错误

9、,只要分母不为0就不会引起除0运行故障,但会使运行结果发生偏差。 例如: short int weight = 42896 ; cout weight endl ; 得到的结果是42896的补码(-22640) 即:42896 - 65536 = -22640,C+实用教程,21,例Ex_OverFlow 一个整型溢出的例子,#include using namespace std; int main() short nTotal, nNum1, nNum2; nNum1 = 1000; nNum2 = 1000; nTotal = nNum1*nNum2; coutnTotal“n“; re

10、turn 0; ,C+实用教程,22,3.2.3 复合赋值,C+实用教程,23,3.2.3 复合赋值,10种复合赋值运算符都是在赋值符“=”之前加上其他运算符而构成的。 在复合赋值运算符之间不能有空格。 复合赋值运算符的优先级和赋值符的优先级一样,在C+的所有运算符中只高于逗号运算符,而且复合赋值运算符的结合性也和赋值符一样,是从右至左。,C+实用教程,24,3.2.4 多重赋值,多重赋值是指在一个赋值表达式中出现两个或更多的赋值符“=”。 赋值表达式几乎可以出现在程序的任何地方,由于赋值运算符的等级比较低,因此这时的赋值表达式两边要加上圆括号。,C+实用教程,25,#include usin

11、g namespace std; int main() int a(2),b,c,d=3; cout(a*=(b=5)-4/(c=2)+d)endl; return 0; ,示例,/ 可以用a*=(b=5)-4/(c=2)+d; cout aendl;代替,C+实用教程,26,3.1 算术运算 3.2 赋值运算 3.3 sizeof运算符 3.4 逗号运算符 3.5 自增和自减 3.6 位运算,C+实用教程,27,3.3 sizeof运算符,sizeof运算符的目的是返回操作数所占的内存空间大小(字节数) 由于同一类型的操作数在不同的计算机中占用的存储字节数可能不同,因此sizeof运算的结果

12、有可能不一样。,sizeof() sizeof(),C+实用教程,28,3.1 算术运算 3.2 赋值运算 3.3 sizeof运算符 3.4 逗号运算符 3.5 自增和自减 3.6 位运算,C+实用教程,29,3.4 逗号运算符,逗号运算符”,”把多个表达式连接起来,构成一个逗号表达式 在计算时,C+将从左至右逐个计算每个表达式,最终整个表达式的结果是最后计算的那个表达式的类型和值,即表达式n的类型和值。 逗号运算符“,”的优先级是最低的,必要时注意加圆括号,以使逗号表达式的运算次序先于其他表达式。,表达式1, 表达式2, 表达式3, , 表达式n,C+实用教程,30,3.4 逗号运算符,例

13、:如果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 就等于20,60,20,C+实用教程,31,3.1 算术运算 3.2 赋值运算 3.3 sizeof运算符 3.4 逗号运算符 3.5 自增和自减 3.6 位运算,C+实用教程,32,3.5 自增和自减,单目运算符自增(+)和自减(-)为左值加1或减1提供一种非常有

14、效的方法。 自增(+)和自减(-)运算符既可放在左值的左边,也可以出现在左值的右边,分别称为前缀运算符和后缀运算符。 前缀运算符、后缀运算符和其他的运算符组合在一起,在求值次序上就会产生根本不同。,C+实用教程,33,自增: + +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-

15、1;,3.5.1 一般用法,C+实用教程,34,3.5.2 前缀和后缀的区别,由于前增量操作返回的值即修改之后的变量值,所以返回的仍然是一个左值。例如: int a=3; +(+a); /ok: +a是左值。a的值是5 由于后增量操作返回的值是原先a的值,而后a的值已经发生变化,故返回的不能是当前a,只能是过去的a值,不能是左值。例如: int a=3; +(a +); /error: a+不是左值,C+实用教程,35,注意事项,(1)前缀自增或自减表达式的结果仍为一个左值,而后缀自增或自减表达式的结果不是左值。对于等级相同的单目运算符来说,哪一个运算符靠近操作数,就和哪个运算符先结合。 (2

16、)自增或自减运算符是两个“+”或两个“-”的一个整体,中间不能有空格。如果有多于两个“+”或两个“-”连写的情况,编译时会首先识别自增或自减运算符。 (3)在有自增或自减运算符的混合运算中,一要注意次序,二要注意左值对应于一块内存空间这个特性 (4)在cout语句中的自增或自减运算中,不同编译器的处理方式也是不一样的。,C+实用教程,36,操作符的识别,编译器采用贪吃法则 如果有多于两个+或两个-连写的情况,则编译首先识别前面两个+或-为增量或减量操作符。 int a = 3, b = 5, c; c = a + b ; / ok; c = a + b ; / 错: 理解为a+ b c = a + b; / ok: a+ +b c = a + b; /

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号