《C++程序设计课件:第3章 表达式与语句》由会员分享,可在线阅读,更多相关《C++程序设计课件:第3章 表达式与语句(38页珍藏版)》请在金锄头文库上搜索。
1、第三章 表达式和语句2本章主要内容o3.1表达式o3.2算术运算和赋值o3.3算术类型转换o3.4增量和减量o3.5关系与逻辑运算o3.6if语句o3.7条件运算符o3.8逗号运算符o3.9求值次序与副作用o作业3学习目标:o理解表达式和语句的概念o掌握运算符的功能与特点o理解运算符的优先级和结合性o理解解决问题的逐步描述方式o理解自顶向下、逐步求精的方法o能够使用if和if/else语句来选择动作o能够使用表达式来描述语句和操作43.1表达式n表达式:含操作符、操作数和标点符号的一个序列,完成一个计算n可以嵌套2+3+(6*sizeof(int)/235n操作符有优先级,级别高者先操作例如:
2、2+3*6中*优先级高于+n操作符有结合性,决定同优先级的操作次序例如:b=5;a=b=3;/先做b=3,再做a=bo表达式概述53.1表达式o左值和右值n左值是能出现在赋值表达式左边的表达式。左值表达式具有存放数据的空间,并且存放是允许的。例如:inta=3;n右值只能出现在赋值表达式的右边。左值表达式也可以作为右值表达式。例如:inta,b=6;a=b;/b是变量,所以是左值,此处作为右值a=8;/8是常量,只能作右值,不能作为左值63.1表达式o语句与块n表达式加上“;”构成表达式语句例如:a=a+2;nif,switch,dowhile,for,while是语句单位,因为其内部含有别的
3、语句,称为复合语句n单独的花括号对包起来的语句是语句块,语句块也是语句n若复合语句内包含复合语句,称为嵌套例如:if(a3)if(ba)c=a+b;elsec=d+6;73.2算术运算和赋值o基本运算符:+-*/%n+:加法或正号n-:减法或负号n*:乘法n/:除法n%:模(整除取余,操作符两边的操作数必须为整型数)说明:两个整数相除,结果为舍去小数部分、截取整数部分;两个整数相模,结果为整除之后的余数,符号和被除数相同。5/-2=-2-5/2=-22/-3=0-2/3=05%-2=1-5%2=-12%-3=2-2%3=-283.2算术运算和赋值o复合运算符+=-=*=/=%=a=a+6与:a
4、+=6等价注意:a+=b+c等价于:a=a+(b+c)(x=max(5,7)+=3;等价于:x=max(5,7)+3;a+=a-=a*a;等价于:a=a+(a=a-a*a);93.2算术运算和赋值o溢出n发生溢出是由于一个变量被赋予一个超出其数据类型表示范围的数值。n数值溢出是不会引起编译错误的,只要分母不为0就不会引起除0运行故障,但会使运行结果发生偏差。例如:在16位机器上进行下面的操作:intweight=42896;得到的结果为:-22640(42896的补码)。103.3算术类型转换o自动转换n字符型、整型、实型之间可以进行混合运算。其中字符型数据以ASC码的十进制数参与运算。运算时
5、,不同类型的数据要先转换成同一类型,然后进行运算。n转换规则:类型转换由系统自动完成。转换总是朝表达数据能力更强的方向,并且转换总是逐个运算符进行的。例如:inti=9;longl=123;floatf=9.9;doubled=9.9;则:i+a+i*f-d/5运算结果为double型113.3算术类型转换charshortintlong intunsigned charunsigned shortunsigned intunsigned longfloatlong doubledouble 类型转换的方向类型转换的方向123.3算术类型转换o强制转换n功能:将一个表达式的值转换成某个类型n格
6、式:(类型名)(表达式)n说明:括号必须,但是,如果表达式是单个操作数,其括号可以省。例如:(int)x(int)(x+y)一般,系统对操作数自动进行类型转换,但如果a%b 要求a和b都是整型,如果不是,必须先进行转换: (int)a%b(int)a%(int)b转换后只得到一个中间变量,被转换的变量的类型不变。133.4增量和减量o自增:+n+i:先加1后使用ni+:先使用后加1例:i=3;j1=+i;j1=4相当于执行:i=i+1;j1=i;j2=i+;j2=3相当于执行:j2=i;i=i+1;由于前增量操作返回的值即修改之后的变量值,所以返回的仍然是一个左值。例如:inta=3;+(+a
7、);/ok:+a是左值。a的值是5+(a+);/error:a+不是左值由于后增量操作返回的值是原先a的值,而后a的值已经发生变化,故返回的不能是当前a,只能是过去的a值,不能是左值143.4增量和减量o自减:-n-i:先减1后使用ni-:先使用后减1例:i=3;j1=-i;j1=2相当于执行:i=i-1;j1=i;j2=i-;j2=3相当于执行:j2=i;i=i-1;n前减量是左值,后减量不是左值。153.5关系与逻辑运算o关系运算符和关系表达式n关系运算符和优先级6种关系运算符:=!=同级(7级)同级(8级)n关系表达式:用关系运算符把操作对象按语法要求联系起来的式子n关系表达式的值1代表
8、“真”0代表“假”n被连接的对象可以是常量、变量、表达式。n其中表达式可以是逻辑、赋值、关系表达式。163.5关系与逻辑运算n关系表达式的值为逻辑值(真/假),可以参加运算1代表“真”n关系表达式的值0代表“假”例:如果:a=1b=2c=3d=ab=ca+5d=(ab)=(c(a+5)结果:d=1d=7/2+ac+1=bc-5d=(7/2+a)(c+1)=(c(a-5)结果:d=0173.5关系与逻辑运算o逻辑运算符和逻辑表达式逻辑运算逻辑判断n逻辑运算符及其优先级3种逻辑运算符:&|!优先级:12132n逻辑表达式逻辑表达式:用逻辑运算符把关系表达式或逻辑量连接起来的式子183.5关系与逻辑
9、运算n逻辑量:常量、变量、及算术、逻辑、赋值表达式真非0:逻辑表达式的值为1n逻辑判断假0:逻辑表达式的值为0a&b:a和b都为“真”时,表达式a&b的值为“真”,否则为“假”a|b:a和b都为“假”时,表达式a|b的值为“假”,否则为“真“!a:a为“真”时,表达式!a的值为“假”,否则为“真”193.5关系与逻辑运算例:a=53&2|84-!0 11 1 3 0 1 1例:x=2;if(x=3)/与if(x=3)不同x=4;coutxendl;/4例:cout32)b)&(n=cd);coutm“,”nendl;/02213.5关系与逻辑运算o短路表达式na|b只要a为真(非0值),就不必
10、判断b的值;只有a为假(0值),才需判断b的值。例:inta=1,b=2,c=3,d=4;intm=2,n=2;(m=ad);coutm“,”nendl;/12223.6if语句oif语句的三种形式if(表达式)语句if(表达式)语句1else语句2if(表达式1)语句1elseif(表达式2)语句2if(表达式)语句elseif语句elseif(表达式n)语句nelse语句n+1233.6if语句oif语句的嵌套n若“语句”之一是if语句,就是if语句嵌套例如,输入两个整数,比较两个数的大小。#includeintmain()intx,y;coutxy;if(x!=y)if(xy)couty
11、endl;elsecoutxyendl;elsecoutx=yendl;运行结果1:Enterxandy:58xy243.6if语句o解决二义性else总是和离它最近的还没有配对的可见的if匹配。例如,写程序段表达下面的含义:1x0y=0x=0-1x0) y=1;else if (x=0) y=0;else y=-1;if (x=0) if (x0) y=1; else y=0;else y=-1;y=0;if (x=0) if (x0) y=1; else y=-1; 1 x0y= 0 x=0 -1 x0y= 0 x=0 -1 x=0) if (x0) y=1;else y=-1;y=0;i
12、f (x=0) if (x0) y=1; else ;else y=-1;263.8逗号表达式o逗号运算符n“ ,”:也称顺序求值运算符n作用:连接表达式o逗号表达式n格式:表达式1,表达式2,表达式nn求解过程:先求表达式1,再求表达式2,最后求表达式n,整个逗号表达式的值为表达式n的值273.8逗号表达式例:如果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所以:
13、a+5就等于206020283.8逗号表达式o在C+中,逗号表达式的最后一个表达式为左值,则该表达式为左值。例如:(a=1,b,c+1,d)=5;/ok:即d=5o在C中,逗号表达式是不能作左值的。293.7条件运算符o格式:表达式1?表达式2:表达式3o运算规则:如果表达式1为“真”,整个表达式的值取表达式2的值,否则取表达式3的值o注意:n逻辑运算符优先级高于赋值运算符,低于条件运算符条件运算符逻辑运算符赋值运算符n优先次序:高低n结合方向为自右至左n表达式2、3的类型可以不同,条件表达式的最终类型为2和3中较高的类型。例:x=34?4:5/2x=(34)?4:(5/2)如果a=4:a=a
14、*5,a*4,a=4?a/2:+aa=a*5,a*4,(a=4?a/2:+a)x=2执行结果:表达式a=a*5,a*4,a=4?a/2:+a的值为:21, a的值也是21如果:表达式是a=a*5,a*4,a=4?a/2:+a 则执行结果为10,a的值是10如果a=4:b=(a*5,a*4,a=4?a/2:+a)执行结果:表达式b=(a*5,a*4,a=4?a/2:+a)的值为:2,a的值是4,b的值是:2313.7条件运算符o在一个条件运算符的表达式中,如果后面两个表达式的值类型相同,均为左值,则该条件运算符表达式的值为左值表达式。例如:intx=5;longa,b;(x?a:b)=1;/ok
15、:因为a和b都是左值(x?x:a)=2;/error:x和a不同类型。/编译器将其理解为(long)x和a(x=2?1:a)=3;/error:1不是左值o在C中,条件运算符是不能作左值的。32运算符优先级1()2!,+,-,+,-,sizeof4*,/,%5+,-7,=,8=,!=12&13|14?:15赋值运算16逗号运算低低高高333.9求值次序与副作用o在表达式中,各操作数的求值次序并没有在ANSIC+标准中规定。于是各个编译器为提高产生目标代码的质量,在不破坏操作符的优先级和结合性的前提下,对操作数(是个表达式)访问进行必要的顺序安排。在顺序安排中,操作数要进行挪动操作,可能会经历求
16、值运算,而求值运算如果修改了另一个表达式中的变量则会产生副作用。343.9求值次序与副作用o不同的编译器求值顺序不同例如:inta=3,b=5,c;c=a*b+b;coutcendl;该段程序在BC中运行得到24,在VC中运行却得到21。353.9求值次序与副作用o求值顺序使交换律失去作用在C+中,对简单的表达式,交换率是成立的,但对复合表达式,交换率未必成立。例如:c=a*b+b;与:c=+b+a*b;在VC中,运行结果前者为21,后者为24。363.9求值次序与副作用o求值顺序使括号失去作用在C+中,对简单的表达式括号优先可以做到,但对复合表达式未必如此。例如:inta=3,b=5,c;c=+b*(a+b);在VC中的结果为54。373.9求值次序与副作用o消除副作用解决表达式副作用的方法是分解表达式语句,即将复合表达式语句写成几个简单的表达式语句。例如:inta,b=20;a=(b=25)+b;表示为:c=b+a*b;b+;或者:b+;c=b+a*b;38o运算符o表达式n算术表达式n赋值表达式n逗号表达式本章小结: