表达式与基本程序控制结构

上传人:san****019 文档编号:22726240 上传时间:2021-05-30 格式:PPT 页数:40 大小:1,011KB
收藏 版权申诉 举报 下载
表达式与基本程序控制结构_第1页
第1页 / 共40页
表达式与基本程序控制结构_第2页
第2页 / 共40页
表达式与基本程序控制结构_第3页
第3页 / 共40页
资源描述:

《表达式与基本程序控制结构》由会员分享,可在线阅读,更多相关《表达式与基本程序控制结构(40页珍藏版)》请在装配图网上搜索。

1、 41 运算符与表达式运算符是指用来表示在数据上执行某些特定操作的符号。参与运算的数据称为操作数。(可以分别称为单目、双目和三目运算符)。表达式是指用运算符和圆括号把常量、变量和函数等运算成分连接起来的有意义的式子。单个常量、变量和函数也可以看成是一个表达式。例如: 98.56 , (98.56) , x , 876-78 ,3*(2.5+5) 都是表达式, l 基本运算符是指完成算术运算、关系运算、逻辑运算、位运算的运算符。 4.1.1 算术运算 5.3%2错l C+中有如下单目运算符: + - (正负号)l C+中有如下双目运算符: + - * / % 5 / 2 5.0 / 2 8 5

2、?l 运算符%的操作数只能是整型或字符型。 当赋值运算符的两边出现相同的变量时,C+还提供了一个简洁的表达方式:x =。其中的x可为 +、-、*、/、等。假定e1和e2是表达式,那么 e1 = (e1) x (e2)就等价于 e1 x = e2例如,表达式 a = a + 9 可以用+ =写成如下形式: a + = 9 注意围绕 e2 的括号。例如,表达式 y - = x + 1 实际上是 y = y - ( x + 1 ) + + 和 - - 运算符增1运算符和减1运算符分别对其操作数进行加1和减1操作,它们既可以用在变量前,作为前缀运算符,例如 int m , n ; + m ; - n

3、; 又可用在变量后,作为后缀运算符。例如: m + ; n - ; 在两种情形下,m的值都将加1而n的值都将减1。前缀增(减)1运算符在使用变量的值之前就使变量值加1或减1,后缀增(减)1运算符在使用变量的值之后才使变量值加1或减1。例如,若n的值为5,那么 x = n + ; 先将n的值5赋给x,即x的值为5,再将 n的值加1,则n为6。而 x = + n ;先将n的值加1得到6,再将n的值赋给x,则x和n的值都为6。 postincrement cout y ; cout ( x y ) 10 ) 当 x = 8 时,上述表达式为0。| 运算符左右两边的表达式只要有一个为真(非0),整个表

4、达式的值就为1。只有当其左右两边的表达式都为0时,整个表达式的值才为0。例如: ( x 20 )当x=36时,此表达式的值为1; x=8时,此表达式的值也为1; x = 16 时, 此表达式的值为0。 ! 运算符用在表达式的前面,表示取表达式的非。若表达式值为0,取非以后为1; 若表达式值为非0,取非以后为0。例如: !(32)的值为0,因为(32)的值为1。C+在计算逻辑表达式的值时,若从左到右计算到某处就已经能够确定表达式的值,则不再继续后面部分的求值。例如,形如 e1 而如果e1的值为0,则计算表达式e3的值,并用它作为整个表达式的值。例如,表达式 ( x y ) ? 10 : 20 如

5、果x的值大于y的值,则表达式的值为10,否则表达式的值为20。 又如,在语句 max = ( a b ) ? a : b ; 中,max将赋值为a、b中较大的数。 4.1.5 运算符的优先级和结合性当一个表达式中有多个运算符时,运算符的优先级和结合性就决定了表达式中各运算的先后顺序。优先级相同时,由结合性决定运算次序。运算符的结合性分为左结合(从左到右计算)和右结合(从右到左计算)。例如,运算符+和-优先级相同、为左结合,因此表达式 45+89-23按从左到右的顺序计算,先做加法再做减法。而赋值运算符=是右结合的,因此表达式 x = y = 78的运算次序为:先将78赋给y,再将y赋给x。 表

6、4.1 C+常用运算符的优先级和结合性优先级运 算 符结合性1 ( ) - . (类成员访问) (数组下标) : : (作用域访问) 左2 *(取内容) 二元运算符又有如下规律:算术关系逻辑; 逻辑运算符有如下规律:! char a = s , b = t ; int w = 2 ; 表达式 表达式的值 z / y z / 4.0 z / y % z / x a b | y z a != b cout radius ; / 输入半径 bulk = (4*3.1416* radius* radius* radius)/3 ; cout bulk = bulk endl ; / 输出体积 4.2.

7、2 选择结构选择结构也称为分支结构,用于处理在程序中出现了两条或更多执行路径可供选择的情况。选择结构可以用选择语句来实现。选择语句包括 if 语句和 switch 语句。1If 语句if语句有两种格式。格式一:if (条件表达式) 语句功能:对条件表达式求值,若值为真(非0)则执行它后面的语句; 否则什么也不做。若需要执行的语句用单条语句写不下,就应该用复合语句。例4.3 将两个数排序输出 。# include void main( ) float a , b , ls ; cout a b ; if ( a b ) ls = a ; / 以下三句的功能为交换a、b的值 a = b ; b =

8、 ls ; cout a b endl ; 格式二 if (条件表达式) 语句1 else 语句2格式二的if语句完成的功能:对条件表达式求值,若值为真(非0)执行其后的语句1; 否则执行else后面的语句2。即根据条件表达式是否为真分别作不同的处理。下面用格式二的if语句改写例4.3。例4.4 对例4.3的改写 。 # include void main( ) float a , b , ls ; cout a b ; if ( a b ) cout a b endl ; /先打印a再打印b else cout b a endl ; /先打印b再打印a 上一节介绍的条件运算符也可以用if语句

9、来改写。例如: y = ( a b ) ? a : b ; 可以用下面这个if语句来代替: if ( a b ) y = a ; else y = b ; 条件表达式取值false: 0true: 所有非0值 例4.5 某单位向职工按月发放医疗补贴的具体方案如下:职工工龄在10年以下的,医疗补贴为其基本工资的10% ; 工龄在10年以上20年以下的,医疗补贴为其基本工资的15% ; 工龄在20年以上30年以下的,医疗补贴为其基本工资的20% ; 工龄在30年以上的,医疗补贴为其基本工资的30%。输入某职工的工龄及基本工资,计算他每月应得的医疗补贴。# include void main( )

10、int seniority ; double wages , allowance ; cout seniority ; /输入工龄 cout wages ; /输入基本工资 if ( seniority 10 ) / 工龄在10年以下 allowance = wages * 0.1 ; else if ( seniority 20 ) / 工龄在10年19年 allowance = wages * 0.15 ; else if ( seniority 30 ) / 工龄在20年29年 allowance = wages * 0.2 ; else allowance = wages * 0.3

11、; / 工龄在30年以上 cout The allowance is : allowance endl ; if语句中也可以包含if 语句,这就构成了if语句的嵌套。 例4.5也可以不使用嵌套的if语句。借助逻辑运算符,用几个并列的if语句来完成例4.5的功能:例4.6 对例4.5的改写。 # include void main( ) int seniority ; double wages , allowance ; cout seniority ; cout wages ; if ( seniority = 10 cout The allowance is : allowance 2 )

12、if ( x 4 ) x = 35 ; else x = 78 ; cout x 2 ) if ( x 2 ) if ( x 4 ) x = 35 ; else x = 78 ; 当x2或者x4时,这两种理解会导致两个不同的答案。这就叫产生了二义性。 在绝大多数的语言中,包括C+,都采用最近匹配原则来解决这个问题。所谓最近匹配原则就是每个else必须与离它最近的那个没有匹配的if相匹配。按照这个原则,上面的第二种理解是正确的。 2switch语句switch语句又称为开关语句,其格式如下: switch (表达式) case 常量表达式1 : 语句序列1 break ; case 常量表达式2

13、 : 语句序列2 break ; case 常量表达式n : 语句序列n break ; default : 语句序列n+1 break ; 其中,switch后面的表达式的类型必须与case后面的常量表达式的类型一致,而且只能是字符型、整型或枚举型(注意不能是浮点型); case后面的表达式必须是常量表达式,不能含有变量 ; 同一个switch中不能有重复的常量表达式。 # include void main( ) int w ; /代表星期的整数 cout w ; switch ( w ) case 0 : cout Its Sunday . endl ; break ; case 1 :

14、 cout Its Monday . endl ; break ; case 2 : cout Its Tuesday . endl ; break ; 例4.7 根据一个代表星期的0到6之间的整数,在屏幕上打印出它代表的是星期几。case 3 : cout Its Wednesday . endl ; break ; case 4 : cout Its Thursday . endl ; break ; case 5 : cout Its Friday . endl ; break ; case 6 : cout Its Saturday . endl ; break ; default :

15、 cout Invalid data ! endl ; default语句是可以缺省的。如果没有default,则当所有匹配都失败时,将不执行任何操作。建议使用default语句,除非case语句已覆盖了所有的可能,以避免由于没有考虑到某种情况而给程序带来的不利影响。 break语句在switch中的作用是跳出整个switch语句。在例4.7中,每个case的语句序列后都有一个break语句(最后一个case或default语句的break可以省略)。在这种情况下,各个case的排列次序可以是任意,不会影响程序的结果。如果没有break,则执行完该case语句的语句序列后,还将接下去执行后面的

16、case的语句序列。在这种情况下,各个case排列的次序不同,就可能产生不同的结果。例如,把例4.7中的break都删去(假定输入的w的值为4),会出现什么情况呢?。如果是在有break的情况下,w应与第五个case中的常量4匹配,从而在屏幕上打印出: Its Thursday .之后就该跳出switch,到达程序末尾并结束。然而,没有了break的switch语句得到的结果与原来大不一样。在打印了上面的字符串后,并不会跳出switch,而是依次进入后面的case及default语句去执行打印语句,于是得到的输出为: Its Thursday . Its Friday . Its Saturd

17、ay . Invalid data ! 如果多个case后的语句序列是相同的,即要做的操作是一样的,可采用下面的格式以避免重复书写: switch (表达式) case 常量表达式1 : case 常量表达式2 : case 常量表达式i : 语句序列 break ; case 常量表达式n : 语句序列n break ; default : 语句序列n+1 # include void main( ) int seniority , s ; double wages , allowance ; cout seniority ; cout wages ; s = seniority / 10

18、; /得到工龄的十位数字 switch ( s ) case 0 : /工龄在10年以下 allowance = wages * 0.1 ; break ; case 1 : / 工龄在10年19年 allowance = wages * 0.15 ; break ; case 2 : / 工龄在20年29年 allowance = wages * 0.2 ; break ; 例4.8 用switch语句来实现例4.5。这个程序是按工龄不会超过49年来设计的。由于switch 不能象if语句那样可以进行大于、小于 等判断,而只能判断是否相等,因此程序中取工龄的十位数字作为switch表达式。c

19、ase 3 : / 工龄在30年49年case 4 : allowance = wages * 0.3 ; break ; default : allowance = 0 ; cout The allowance is : allowance endl ; 4.2.3 循环结构C+中有三种循环语句可用来实现循环结构:while语句、do_while语句和for语句。这些语句各有各的特点,而且常常可以互相替代。在编程时应根据题意选择最适合的循环语句。 1while语句while语句的格式为: 例4.9 计算100之内的奇数之和。 # include void main( ) int n = 1

20、; / 奇数 int sum = 0 ; / 奇数的累加和 while ( n 100 ) / n不能超过100 sum += n ; / 累加 n += 2 ; / 修改为下一个奇数 cout The sum is : sum endl ; while语句的执行过程: 对条件表达式求值,如果值为真(非0)则执行步骤,否则转步骤; 执行循环体中的语句; 返回 ; 终止循环,去执行while语句的下一语句。while (条件表达式) 语句 /循环体 例4.10 将例4.6改进为可以重复计算不同的人的医疗补贴。以输入的工龄为0作为结束条件。 # include void main( ) int s

21、eniority ; double wages , allowance ; cout seniority ; /输入第一个人的工龄 while ( seniority != 0 ) /若工龄不为0则进入循环 cout wages ; if ( seniority = 10 cout The allowance is : allowance endl ; cout seniority ; /输入下一人的工龄 break语句不仅可用于跳出switch语句,还可用于跳出循环(包括三种循环语句)。但它只能跳出它所在的循环语句或switch语句,不能跳出外层的循环语句或switch语句(如果有的话)。若

22、想跳出外层语句,还要在外层中使用break。例4.11 从键盘接收10个整数,求它们的平方根。若遇到负数就终止程序。# include # include void main( ) int i = 1 , num ; double root ; while ( i = 10 ) cout num ; if ( num 0 ) /若num是负数则退出循环 break ; root = sqrt(num) ; cout root endl ; i+ ; 这个程序有两个出口。每个输入的数在计算其平方根之前都要判断它的正负,若为负数就退出循环,这是一个出口。另外,整型变量被用来实现记数。i的初值为1,

23、每执行一次循环体就将它的值加1,当它的值为11时,表示循环体已经执行了10次,于是循环终止。这是第二个出口。这样的程序可读性较差。 例4.12 对例4.11的改进:遇到负数则忽略并重新输入下一个数据。 # include # include void main( ) int i = 1 , num ; double root ; while ( i = 10 ) cout num ; if ( num 0 ) /若num是负数则回到循环开始处 cout valid number! ; continue ; root = sqrt(num) ; cout root endl ; i+ ; con

24、tinue语句用在循环体中,它的作用是忽略循环体中位于它之后的语句,重新回到条件表达式的判断。 2do_while循环语句while语句的特点是先判断条件,再确定是否执行循环体,也即“先判断,后执行”;如果第一次对条件表达式求值时它就为假,则循环体就一次也不被执行。do_while语句是先执行一次循环体之后,再根据条件表达式的值确定是否还要继续执行循环体,也即“先执行,后判断”,循环体至少会被执行一次。do_while语句的格式为: do 语句 /循环体 while (条件表达式) ; 其中的条件表达式及语句的规定同while 语句一样。注意条件表达式后面的分号不能少,因为整个do_while

25、语句实际上相当于一条语句。do_while语句的执行过程如下: 执行一遍循环体; 对条件表达式求值,若为真(非0)则转步骤,否则转步骤; 终止循环,去执行do_while语句的下一语句。 do_while和while语句在大多数情况下都可以相互替代(除非是有可能循环体一次也不被执行的情况)。例如,例4.9中是利用while语句来计算100之内的奇数之和的,可以将它改写为用do_while语句来求和。例4.13 用do_while语句来改写例4.9 。 # include void main( ) int n = 1 ; / 奇数 int sum = 0 ; / 奇数的累加和 do sum +=

26、 n ; / 累加 n += 2 ; / 修改为下一个奇数 while ( n 100 ) ; cout The sum is : sum endl ; 例4.14 根据下面的公式求的值。计算到最后一项的绝对值小于10-6时停止。 /4 = 1 1/3 + 1/5 1/7 # include void main( ) double pi = 0 , x = 1 ; int s = 1 ; do pi = pi + s / x ; x += 2 ; s = - s ; while ( 1 / x = 1e-6 ) ; pi = pi * 4 ; cout pi= pi endl ; 3for语句

27、当循环次数确定的时候,用 for 语句更为直观。for语句的格式如下:for ( 表达式1; 表达式2; 表达式3 ) 语句 /循环体其中的表达式1通常用于对循环控制变量进行初始化; 表达式2用于表示循环是否结束的条件; 表达式3用于对循环控制变量作修改。for语句执行的过程如下: 对表达式1求值; 对表达式2求值,若其值为真则执行步骤,否则转步骤; 执行循环体; 对表达式3求值; 转步骤; 结束循环,去执行for语句的下一语句。例如:int i ; for ( i = 1 ; i = 10 ; i+ ) cout $ ; 程序的运行结果是:$for语句也属于“先判断,后执行”的循环语句,可以

28、用while语句替代。例如,上面这个程序段可以改写为:int i = 1 ; while (i = 10 ) cout $ ; i + ; C+中for语句的形式很灵活,for后面的三个表达式均可以缺省(但中间的分号不能缺省)。例如上面的程序段也可写成下面的形式: int i = 1; for ( ; i = 10 ; i+ ) cout $ ; 或者 int i = 1 ; for ( ; i = 10 ; ) cout 10) break ; cout $ ; 例4.15 用for语句改写例4.9/例4.13 。 # include void main( ) int sum = 0 ; /

29、 奇数的累加和 for ( int n = 1 ; n 100 ; n = n + 2 ) sum += n ; / 累加 cout The sum is : sum endl ; 在此例中,将变量n的声明及初始化作为for语句的第一个表达式,这是完全可以的。C+的变量可以随时定义,随时使用。只是定义在不同地方的变量的作用域可能会有所不同。比如上例中,如果将变量n定义在for语句的前面,它的作用域就会发生改变。 4多重循环 一个循环的循环体中如果又包含另外的循环,就构成了循环的嵌套。前者称为外循环,后者称为内循环。根据循环嵌套的重数,可以有双重循环、三重循环,统称多重循环。例4.16 分析下面

30、程序的运行结果。 # include void main( ) for ( int i = 1 ; i = 4 ; i+ ) for ( int j = 1 ; j = 5 ; j+ ) cout i + j ; cout = 73 ) ( x != y ) | ( c B ) z int *p = char c = A ; float a = 3 , b = 72 ; cout= 73 ) )endl;cout B )endl;cout y)endl;cout y )endl;cout(200 * x / y) endl;cout(double(x) / y +23)endl;cout( x / y + 23 )endl;cout( c + y % x)endl;cout(x *= int(b/a) + y)endl;cout 0)endl;cout( +x = y ? x+ : y+)endl;cout(* p * y)endl;cout(+x - y- )endl; 010012023.623678715 52883

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!