收藏 分享(赏)

第三章 表达式与语句.ppt

上传人:w89153 文档编号:4868707 上传时间:2019-01-18 格式:PPT 页数:53 大小:590KB
下载 相关 举报
第三章 表达式与语句.ppt_第1页
第1页 / 共53页
第三章 表达式与语句.ppt_第2页
第2页 / 共53页
第三章 表达式与语句.ppt_第3页
第3页 / 共53页
第三章 表达式与语句.ppt_第4页
第4页 / 共53页
第三章 表达式与语句.ppt_第5页
第5页 / 共53页
点击查看更多>>
资源描述

1、1,第三章 表达式和语句,本章目标 1.理解表达式和语句的概念; 2.掌握各种运算符的功能与特点,产生副作用原因。,2,3.1 表达式,1.表达式概述由操作符、操作数和标点符号组成的序列,用来说明计算过程。如:2+3+(5*sizeof(int)/345根据某些约定、求值次序、结合和优先级规则来计算。,3,约定:类型转换,如:float a;a=5/2; 求值次序:表达式中各个操作数的求值次序视编译器不同而不同。 结合性:表达式中出现同等优先级的操作符时,该先做哪个操作的规定。 如:d=a+b+c;d=a=3;,4,优先级:不同优先级的操作符,总是先做优先级高的操作。d=a+b*c;*x+;/

2、先做x+,5,2.左值与右值 左值(left value,简写为lvalue)是出现在赋值表达式左边的表达式。左值表达式具有存放数据的空间,并且存放是允许的。如:int a=3;const int b=4;/error 右值只能出现在赋值表达式的右边。左值可以作为右值表达式。,6,int a,b=6;a=b;a=8; 表达式可产生左值、右值或不产生值。如:int a; (a=4)=28; Void f()return ;,7,3.优先级和结合性看表3-14.语句与块C+所有的操作运算通过表达式来实现。表达式语句由表达式组成的语句,表达式和;组成。 语句是用来规定程序执行的控制流。在没有跳转和分

3、支的情况下,按照其在程序中出现的次序顺序执行。,8,语句可以是空语句。它不产生任何操作运算,只是作为形式上的语句,被填充在控制结构中。如: if(x9) ; elsecout“not large than 9n”,9,块是指括在一对花括号里的语句序列。块可被认为单个语句,如: If(x9) cout“The number is perfect .n”; cout“It is large than 9n”; else cout“not large than 9n”; ,10,3.2 算术运算和赋值,1.操作符种类 (加法运算符,或正值运算符。如3+5,+3) (减法运算符,或负值运算符。如5-2

4、,-3) * (乘法运算符。如3*5) (除法运算符。如5/3)注:整型,浮点区别 (模运算符,或称求余运算符,两侧均应为整型数据,如的值为)。,11,需要说明,两个整数相除的结果为整数,如5/3的结果值为1,舍去小数部分。但是,如果除数或被除数中有一个为负值,则舍入的方向是不固定的。例如,-5/3在有的C+系统上得到结果-1,有的C+系统则给出结果-2。多数编译系统采取“向零取整”的方法,即5/3的值等于1,-5/3的值等于-1,取整后向零靠拢。 如果参加+, -, *, / 运算的两个数中有一个数为float型数据,则运算的结果是double型,因为C+在运算时对所有float型数据都按d

5、ouble型数据处理。,12,2.赋值缩写 赋值符号“”就是赋值运算符,它的作用是将一个数据赋给一个变量。如“a=3”的作用是执行一次赋值操作(或称赋值运算)。把常量3赋给变量a。也可以将一个表达式的值赋给一个变量。 当一变量既出现在表达式的左边又出现在右边时,可以缩写,如: x=x*y;缩写为:x*=y; x=x+y;缩写为:x+=y; x=x-y;缩写为:x-=y; x=x/y;缩写为:x/=y; x=x%y;缩写为:x%=y;,13,赋值以及缩写都要求左边的表达式为左值,即x为左值。 赋值构成一个表达式,因而它具有值。如:cout(x=5)endl; (x=max(5,7)+=3;,14

6、,3.溢出 发生溢出是由于一个变量被赋予一个超出其数据类型表示范围的数值。在16位机上: int weight=42896; 溢出值是多少?,15,3.3算术类型转换,C+遇到两种不同类型的数据进行运算时,例如:60A,会将两个数作适当的类型转换,然后再进行运算,转换方法如下图所示。,16,如果一个char型数据和一个int型数据相加,则将char型数据转换成int型数据,然后进行运算,例如:60+A=60+65=125。 如果一个long int型数据和一个float型数据相加,则先将两个数据都转换成double型数据,然后进行运算。 例如:long int a=20;float b=15.

7、32;double x;x=a+b,17,如果一个int型数据和一个unsigned long型数据相乘,则先将两个数据都转换成double型数据,然后进行运算。 例如:unsigned a=20; int b=15;double x;x=a*b;,18,转换总是朝表达数据能力更强的方向,并且转换总是逐个运算符进行的。例:float f=3.5; int n=6; long k=21; double ss; ss=f*n+k/2; coutss; 运行结果:31,转换成double,整除后转换为double,19,整型运算过程中自动进行的类型转换称为隐式类型转换。问题:long m=234*4

8、56/6;/为什么错 怎么改?,20,强制转换类型又称显式转换,其语法是在一个数值或变量前加上带括号的类型名,也可以类型名后跟带括号的数值或表达式。 short int m=234; cout(long)m*456/6endl; 运行结果: 17784 上面的语句也可以写成: coutlong(m)*456/6endl;,21,cout(unsigned long)234*456/6endl; coutunsigned long(234)*456/6endl;/error 注意:coutlong(234*456)/6endl;/为什么错?,22,3.4 增量和减量,增运算:+ +i 使用之前

9、i 的值加1 例:n=5;i=3;x=n+(+i); 运行后:i=4、x=9 i+ 使用之后 i 的值加1 例:n=5;i=3;x=n+(i+);运行后:i=4、x=8,23,自减运算:- - . -i 使用之前i的值减1 例:n=5;i=3;x=n+(-i); 运行后:i=2、x=7 . i- 使用之后i的值减1 例:n=5;i=3;x=n+(i-); 运行后:i=2、x=8,24,说明: 自增运算符(+ +)、自减运算符(- -),只能用于变量,而不能用于常量和表达式。例如:5+、(a+b)-是错误的。 +和-的运算顺序是“从右到左”。 例:-i+ 应该理解为-(i+)。(-i)+ 是错误

10、的,25,C+语言的表达式中有多个运算符时,处理原则是“从左到右”。 例:i+j 应该理解为(i+)+j。i+(+j) 是错误的,26,3.5 关系与逻辑运算,关系运算符: 数学不等号 C+语言运算符 = = = !=,27,例:若a=20,b=15,c=0 关系式 成立否 结果aba-b=400a+b!=a*bAa+b等价于c(a+b) ab!=c等价于(ab)!=c a=bc等价于a=(bc),成立,成立,不成立,不成立,成立,成立,不成立,成立,不成立,True,True,False,False,True,True,False,True,False,28,逻辑表达式 逻辑运算符& 与|

11、或! 非,0x5,0x 并且 x5,0=x & x5,29,3. 逻辑表达式 逻辑运算符& 与| 或! 非,x5,0=x | x5,30,逻辑运算符的运算规则:! & | 逻辑表达式 例:若x=5 y=100!(x*y=500)&(x0)|(x10)结果为:True,31,3.6 if语句,1. if(表达式)语句 例如: if(xy) couty) coutx; else couty; 见图3.1(b)。,32,图 3.1,33,3. if(表达式1) 语句1 else if(表达式2) 语句2 else if(表达式3) 语句3 else if(表达式m) 语句m else 语句n流程图见

12、图3.6。 例如: if (number500) cost=0.15; else if(number300) cost=0.10; else if(number100) cost=0.075; else if(number50) cost=0.05; else cost=0;,34,图 3.6,35,说明: (1) 从图3.1和图3.2可以看到: 3种形式的if语句都是由一个入口进来,经过对“表达式”的判断,分别执行相应的语句,最后归到一个共同的出口。这种形式的程序结构称为选择结构。在C+中if语句是实现选择结构主要的语句。 (2) 3种形式的if语句中在if后面都有一个用括号括起来的表达式,

13、它是程序编写者要求程序判断的“条件”,一般是逻辑表达式或关系表达式。 (3) 第2、第3种形式的if语句中,在每个else前面有一分号,整个语句结束处有一分号。 (4) 在if和else后面可以只含一个内嵌的操作语句(如上例),也可以有多个操作语句,此时用花括号“”将几个语句括起来成为一个复合语句。,36,例 求三角形的面积。 #include #include /使用数学函数时要包含头文件cmath #include /使用I/O流控制符要包含头文件iomanipint main( ) double a,b,c;coutabc;,37,if (a+bc ,38,运行情况如下: please

14、enter a,b,c:2.45 3.67 4.89 area=4.3565 if语句的嵌套 在if语句中又包含一个或多个if语句称为if语句的嵌套。一般形式如下: if( ) if( )语句1 else 语句2 内嵌if else if( )语句3 else 语句4 内嵌if,39,应当注意if与else的配对关系。else总是与它上面最近的、且未配对的if配对。假如写成 if( ) if( )语句1 else if( )语句2 else 语句3 内嵌if 编程序者把第一个else写在与第一个if(外层if)同一列上,希望else与第一个if对应,但实际上else是与第二个if配对,因为它们

15、相距最近,而且第二个if并未与任何else配对。为了避免误用,最好使每一层内嵌的if语句都包含else子句(如本节开头列出的形式),这样if的数目和,40,else的数目相同,从内层到外层一一对应,不致出错。 如果if与else的数目不一样,为实现程序设计者的企图,可以加花括号来确定配对关系。例如: if( ) if ( ) 语句1 /这个语句是上一行if语句的内嵌if else 语句2 /本行与第一个if配对 这时 限定了内嵌if语句的范围, 外的else不会与 内的if配对。关系清楚,不易出错。,41,3.7 条件运算符,1语法格式:? : 2说明 例:max=(ab) ? a : b;,

16、if (ab) max=a; else max=b;,42,条件运算符要求有3个操作对象,称三目(元)运算符,它是C+中惟一的一个三目运算符. 条件运算符的执行顺序是:先求解条件表达式,若为非0(真)则求解表达式1,此时表达式1的值就作为整个条件表达式的值。若条件表达式的值为0(假),则求解表达式2,表达式2的值就是整个条件表达式的值。“max=(ab)?a:b” 的执行结果是将条件表达式的值赋给max。也就是将a和b二者中的大者赋给max。条件运算符优先于赋值运算符,因此上面赋值表达式的求解过程是先求解条件表达式,再将它的值赋给max。,43,条件表达式中,条件表达式的类型可以与表达式1和表

17、达式2的类型不同。如x? ab 如果已定义x为整型变量,若x=0,则条件表达式的值为字符b的ASCII码。表达式1和表达式2的类型也可以不同,此时条件表达式的值的类型为二者中较高的类型。如有条件表达式xy?1:1.5,如果xy,则条件表达式的值为1.5,若xy,值应为1,由于C+把1.5按双精度数处理,双精度的类型比整型高,因此,将1转换成双精度数,以此作为表达式的值。,44,例 输入一个字符,判别它是否为大写字母,如果是,将它转换成小写字母;如果不是,不转换。然后输出最后得到的字符。 #include using namespace std; int main( ) char ch;cinc

18、h;ch=(ch=A ,45,3.8 逗号表达式,格式:表达式1,表达式2,,表达式n 功能:按照“从左到右”的顺序,先计算表达式1,将其值代入表达式2,再计算表达式2,,最后计算表达式n,整个表达式的值等于最后表达式n的值。,46,例:35,68 表达式的值为14a=3*5,a*4先求解a=3*5,得a的值为15,然后求解a*4,得60,整个表达式的值为60。,47,3.9 求值次序与副作用,在表达式中,同一个程序在不同的C+版本中在求值次序或者运算结果有可能不同。,48,不同的求值顺序例如:#includevoid main()float a=3,b=5,c; c=a*b+b;coutce

19、ndl; 运行结果 在BC中: 24 在VC6.0中:21,49,求值顺序使交换率失去作用a+b=b+a 例如: #include void main() float a=3,b=5,c; c=a*b+(+b); c= (+b) +a*bcoutcendl; ,50,求值顺序使括号失去作用 例如: #include void main() float a=3,b=5,c; c= +b*(a+b)coutcendl; ,51,分析:预想的操作应为先做a+b得8,然后乘以+b得6*8=48,但实际上在VC6.0中是先计算+b得b=6,然后6*(3+6)=54,52,消除副作用举的例子中,原因主要是+b引起的。+b具有变量b的修改(副作用)和它所提供的表达式两个操作。同样赋值表达式也会引起副作用。例如:int a,b=20;a=(b=25)+b;a是25+20,还是25+25?分析后,赋值表达式同样有提供表达式值的同时修改变量的行为。,53,表达式和语句的副作用,说明编程者对程序思路还有不够完善不够周密的地方。它导致可读性下降,也破坏了可读性。所以务必要避免副作用的产生。解决的办法分解表达式语句,将复合表达式写成几个简单的表达式语句。如:c=b+a*b;b+; 或者:b+=;c=b+a*b;,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 实用文档 > 统计图表

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报