第4章C--表达式与基本程序控制结构课件.ppt
第第4章章 C+表达式表达式与基本程序控制结构与基本程序控制结构 运算符是指用来表示在数据上执行运算符是指用来表示在数据上执行某些特定操作的符号。某些特定操作的符号。参与运算的数据称为操作数。参与运算的数据称为操作数。根据参与运算的操作数的个数是一根据参与运算的操作数的个数是一个、两个或三个,运算符分为一元运算个、两个或三个,运算符分为一元运算符、二元运算符和三元运算符。符、二元运算符和三元运算符。4 41 1 运算符与表达式运算符与表达式表达式表达式是指用运算符和圆括号把常量、变量用运算符和圆括号把常量、变量和函数等运算成分连接起来的有意义的式子和函数等运算成分连接起来的有意义的式子。单个常量、变量和函数也都可以看成是一个单个常量、变量和函数也都可以看成是一个表达式。表达式。表达式经过计算后都会得到一个确定的表达式经过计算后都会得到一个确定的值,这个值就是表达式的值。值,这个值就是表达式的值。每个表达式都具有唯一确定的值每个表达式都具有唯一确定的值和唯一确定的类型。和唯一确定的类型。例如:例如:98.56,(98.56),x,876-78,3*(2.5+5),sqrt(9)都是合法的表达式。都是合法的表达式。它们的值分别为它们的值分别为98.56、98.56、x的值、的值、794、22.5、3。其中其中sqrt()是一个计算平方根的标准函是一个计算平方根的标准函数,包含在库数,包含在库math.h中。中。C+中有一种表达式称为逗号表达式,指的中有一种表达式称为逗号表达式,指的是用逗号分隔开的表达式序列。是用逗号分隔开的表达式序列。比如:比如:x=3,y=8,x+y逗号表达式的求值次序是从左到右依次计逗号表达式的求值次序是从左到右依次计算各表达式的值,以最后一个表达式的值和类算各表达式的值,以最后一个表达式的值和类型作为整个逗号表达式的值和类型。比如上面型作为整个逗号表达式的值和类型。比如上面这个逗号表达式的值为这个逗号表达式的值为11。4.1.1 算术表达式算术表达式用用算算术术运运算算符符(+、-、*、/)连连接接起起来的表达式就称为算术表达式。来的表达式就称为算术表达式。用用除除法法运运算算符符进进行行整整数数除除法法与与进进行行浮浮点点数数除除法法是是不不同同的的。用用于于整整数数时时,表表示示整整除除,如如果有余数,余数部分就被省略了。如:果有余数,余数部分就被省略了。如:5/2 得到的结果为得到的结果为 2(int型)型)8/5 得到的结果为得到的结果为 1(int型)型)而用于浮点数时:而用于浮点数时:5.0/2.0 得到的结果为得到的结果为 2.5(float型)型)8.0/5.0 得到的结果为得到的结果为 1.6(float型)型)取取余余运运算算符符用用于于取取整整数数除除法法的的余余数数,是是对对除法运算符的一个必要的补充。除法运算符的一个必要的补充。如:如:5 2 得到的结果为得到的结果为 1 8 5 得到的结果为得到的结果为 3在在/和和%运运算算中中,注注意意除除数数不不能能为为零零,否否则则将将产生溢出错误。产生溢出错误。在在做做+和和*运运算算特特别别是是*运运算算时时,很很容容易易出出现现运运算算结结果果产产生生溢溢出出的的情情况况,要要注注意意将将数数据据定定义义为为足足够够长度的类型。长度的类型。当当赋赋值值运运算算符符的的两两边边出出现现相相同同的的变变量量时时,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;又可用在变量后,作为后缀运算符。例如又可用在变量后,作为后缀运算符。例如:m+;n-;前前缀缀增增(减减)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。4.1.2 关系运算关系运算C+的的关关系系运运算算符符都都是是二二元元的的,有有、=、=4 的值为的值为1,而表达式而表达式 67!=67 的值为的值为0。例例4.1 关于关系运算的一个例子关于关系运算的一个例子#include void main()double x=45.3,y;couty;cout(xy)10)&(x20)例如,当例如,当 x=14 时,上述表达式为时,上述表达式为1;当当 x=8 时,上述表达式为时,上述表达式为0。|运算符左右两边的表达式只要有一个为运算符左右两边的表达式只要有一个为真(非真(非0),整个表达式的值就为),整个表达式的值就为1。只有当其。只有当其左右两边的表达式都为左右两边的表达式都为0时,整个表达式的值时,整个表达式的值才为才为0。例如:例如:(x20)当当x=36时,此表达式的值为时,此表达式的值为1;x=8时,此表时,此表达式的值也为达式的值也为1;x=16 时,此表达式的值为时,此表达式的值为0。!运运算算符符用用在在表表达达式式的的前前面面,表表示示取取表表达达式式的的非非。若若表表达达式式值值为为0,取取非非以以后后为为1;若若表表达式值为非达式值为非0,取非以后为,取非以后为0。例如:例如:!(32)的值为的值为0,因为,因为(32)的值为的值为1。C+在在计计算算逻逻辑辑表表达达式式的的值值时时,若若从从左左到到右右计计算算到到某某处处就就已已经经能能够够确确定定表表达达式式的的值值,则则不不再再继继续续后后面部分的求值。面部分的求值。例例如如,形形如如 e1&e2 的的表表达达式式,在在已已求求得得表表达达式式e1的的值值为为0的的情情况况下下,已已经经能能够够确确定定整整个个逻逻辑辑表表达式的值为达式的值为0,C+就不再对就不再对e2求值。求值。同同样样,形形如如 e1|e2 的的表表达达式式,如如果果已已经经求求得得e1的的值值为为1,则则整整个个表表达达式式的的值值一一定定为为1,C+就就不不再再对对e2求值。求值。4.1.4 条件运算符条件运算符条件运算符条件运算符?:是是C+中唯一的一个三元运算符。中唯一的一个三元运算符。条件运算符的表达式具有如下形式条件运算符的表达式具有如下形式:e1?e2:e3 其中其中e1、e2、e3皆为表达式。皆为表达式。条条件件运运算算执执行行的的操操作作是是:先先计计算算表表达达式式e1的的值值,如如果果为为非非0,则则计计算算表表达达式式 e2 的的值值并并把把它它作作为为整整个个表表达达式式的的值值;而而如如果果e1的的值值为为0,则则计计算算表表达达式式e3的的值值,并并用用它它作为整个表达式的值。作为整个表达式的值。例如,表达式例如,表达式 (x y)?10:20 如如果果x的的值值大大于于y的的值值,则则表表达达式式的的值值为为10,否否则则表表达式的值为达式的值为20。又又如如,在在语语句句 max=(ab)?a:b;中中,max将将赋赋值值为为a、b中较大的数。中较大的数。4.1.5 位运算位运算在计算机存储器中,所有的数据都是以二进在计算机存储器中,所有的数据都是以二进制形式存放的。位运算是对二进制机器数进行的制形式存放的。位运算是对二进制机器数进行的操作。操作。C+中的位运算符有中的位运算符有6种种:按优先级顺序为按优先级顺序为,(),&,|。位运算符的运算对象只能是整型(位运算符的运算对象只能是整型(int)或字)或字符型(符型(char),位运算不改变运算对象本身。),位运算不改变运算对象本身。例例4.2 下面的小程序将输出下面的小程序将输出:fedcba98#includevoid main()int a=0 x01234567;/0000 0001 0010 0011 0100 0101 0110 0111 couthexaendl;/1111 1110 1101 1100 1011 1010 1001 1000(1)(按位求反):(按位求反):一元运算,将运算对象各位求反。一元运算,将运算对象各位求反。(2)(右移)(右移):二元运算,左操作数为移位对象,右操作数为移二元运算,左操作数为移位对象,右操作数为移动位数动位数n。返回移位对象整体向右移动。返回移位对象整体向右移动n位,高位位,高位用用n个个0填补以后的值。(当移位对象为负数的补填补以后的值。(当移位对象为负数的补码时,高位用码时,高位用n个个1填补。)填补。)例例4.3 左移和右移左移和右移#includevoid main()int a=0 x0089abcd;/0000 0000 1000 1001 1010 1011 1100 1101int b=-100;/1111 1111 1111 1111 1111 1111 1001 1100 couthex(a5)endl;/0001 0001 0011 0101 0111 1001 1010 0000couthex5)endl;/0000 0000 0000 0100 0100 1101 0101 1110 couthex(b5)endl;/1111 1111 1111 1111 1111 0011 1000 0000couthex5)endl;/1111 1111 1111 1111 1111 1111 1111 1100程序输出:程序输出:113579a044d5efffff380fffffffc(4)&(按位与):(按位与):二元运算,将两个运算对象按位相与。二元运算,将两个运算对象按位相与。(5)(按位异或):(按位异或):二元运算,将两个运算对象按位异或。二元运算,将两个运算对象按位异或。(6)|(按位或):(按位或):二元运算,将两个运算对象按位相或。二元运算,将两个运算对象按位相或。例例4.4 按位逻辑运算按位逻辑运算#includevoid main()int a=0 x01234567;/0000 0001 0010 0011 0100 0101 0110 0111int b=0 x89abcdef;/1000 1001 1010 1011 1100 1101 1110 1111 couthex(a&b)endl;/0000 0001 0010 0011 0100 0101 0110 0111couthex(ab)endl;/1000 1000 1000 1000 1000 1000 1000 1000 couthex(a|b)endl;/1000 1001 1010 1011 1100 1101 1110 1111程序输出:程序输出:12345678888888889abcdef4.1.6 求字节数运算求字节数运算求字节数运算为一元运算,用求字节数运算为一元运算,用sizeof()运算符。其功能是求变量或表达式的数据类运算符。其功能是求变量或表达式的数据类型在内存中占据的字节数。待求字节数的表型在内存中占据的字节数。待求字节数的表达式放在括号中,返回值为整型。达式放在括号中,返回值为整型。例例4.5 求字节数运算求字节数运算#include#includevoid main()short a=-32768;float b=9.0;double c=5.7;char d=k;coutsizeof(a);coutsizeof(b);coutsizeof(c);coutsizeof(d);coutsizeof(sqrt(b);coutsizeof(a+b+c).(类成员访问)(类成员访问)(数组下标)(数组下标):(作用域访问)(作用域访问)左左2*(取内容取内容)&(取地址取地址)!+-+(一元一元)-(一元一元)sizeof右右3*(乘乘)/%左左4+-左左5左左6 =左左7=!=左左8&左左9|左左10?:(条件运算)(条件运算)右右11=+=-=*=/=%=&=|=右右12,左左C+各各运运算算符符的的优优先先级级总总的的来来说说有有如如下下规规律律(按优先级从高到低):(按优先级从高到低):一元一元二元二元(除了赋值除了赋值)三元三元赋值赋值逗号逗号;二元运算符又有如下规律:二元运算符又有如下规律:算术算术关系关系逻辑逻辑;逻辑运算符有如下规律:逻辑运算符有如下规律:!&|。例例4.7 根据表达式的求值次序,求下列表达式的值根据表达式的求值次序,求下列表达式的值假定有假定有 int x=5,y=4,z=6;char a=s,b=t;int w=2;表达式表达式 表达式的值表达式的值 z/y z/4.0 z/y%z/x a b|y z a!=b&z 6 a=b&!(y z)a=b&!y z x+1 +z x+1 z+-x -y|x+y z&z%3=0 (x+,x+=y,x+y)11.50100110114按按照照结结构构化化程程序序设设计计的的思思想想,程程序序由由三三种种单单入入口口、单单出出口口的的基基本本结结构构组组成成:顺序结构、选择结构、循环结构。顺序结构、选择结构、循环结构。C+的的控控制制流流就就是是由由这这三三种种基基本本结结构组成的。构组成的。4 42 2 基本程序控制结构基本程序控制结构4.2.1 顺序结构顺序结构 顺顺序序结结构构的的程程序序是是指指程程序序中中的的所所有有语语句句都都是是按按书书写写顺顺序序逐逐一一执执行行的的,只只有有顺顺序序结结构构的的程程序序功功能能有有限。限。例例4.8 计算球的体积计算球的体积。已知球的体积公式为:已知球的体积公式为:4R3V=3#include void main()float radius,bulk;cout radius;/输入半径输入半径 bulk=(4*3.1416*radius*radius*radius)/3;cout bulk=bulk endl;/输出体积输出体积 选选择择结结构构也也称称为为分分支支结结构构,用用于于处处理理在在程程序序中中出出现现了了两两条条或或更更多多执执行行路路径径可可供供选选择择的的情情况况。选选择择结结构构可可以以用用选选择择语语句句来来实实现现。选选择择语语句句包包括括 if 语语句句和和 switch 语句。语句。4.2.2 选择结构选择结构1If 语句语句if语句有两种格式。语句有两种格式。格式格式1:if (条件表达式条件表达式)语句语句功功能能:对对条条件件表表达达式式求求值值,若若值值为为真真(非非0)则执行它后面的语句则执行它后面的语句;否则什么也不做。否则什么也不做。若若需需要要执执行行的的语语句句用用单单条条语语句句写写不不下下,就就应应该用复合语句。该用复合语句。例例4.9 将两个数排序输出将两个数排序输出#include void main()float a,b,ls;cout ab;if (ab)ls=a;a=b;b=ls;couta b endl;格式格式2:if(条件表达式条件表达式)语句语句1 else 语句语句2 功功能能:对对条条件件表表达达式式求求值值,若若值值为为真真(非非0)执执行行其其后后的的语语句句1;否否则则执执行行else后后面面的的语语句句2。即即根根据据条条件件表表达达式式是是否否为为真真分分别作不同的处理。别作不同的处理。4.10 用用if else 对例对例4.9的改写的改写#include void main()loat a,b,ls;coutab;if(ab)couta bendl;else cout b a endl;上上一一节节介介绍绍的的条条件件运运算算符符也也可可以以用用if语语句来改写。例如:句来改写。例如:y=(ab)?a:b;可以用下面这个可以用下面这个 if-else 语句来代替:语句来代替:if (ab)y=a;else y=b;if语语句句中中也也可可以以包包含含if 语语句句,这这就就构成了构成了if语句的嵌套。语句的嵌套。例例4.11 某某单单位位向向职职工工按按月月发发放放医医疗疗补补贴贴的的具具体体方方案案如如下下:职职工工工工龄龄在在10年年以以下下的的,医医疗疗补补贴贴为为其其基基本本工工资资的的10%;工工龄龄在在10年年以以上上20年年以以下下的的,医医疗疗补补贴贴为为其其基基本本工工资资的的15%;工工龄龄在在20年年以以上上30年年以以下下的的,医医疗疗补补贴贴为为其其基基本本工工资资的的20%;工工龄龄在在30年年以以上上的的,医医疗疗补补贴贴为为其其基基本本工工资资的的30%。输输入入某某职职工工的的工工龄龄及及基基本本工工资资,计计算算他每月应得的医疗补贴。他每月应得的医疗补贴。#include void main()int seniority;double wages,allowance;coutseniority;/输入工龄输入工龄 coutwages;/输入基本工资输入基本工资 if (seniority10)/工龄在工龄在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;/工龄在工龄在30年以上年以上 coutThe allowance is:allowanceendl;#includevoid main()int seniority;double wages,allowance;cout seniority;cout wages;if (seniority=10&seniority=20&seniority=30)allowance=wages*0.3;cout The allowance is:allowance 2)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:语句序列语句序列2 break;case 常量表达式常量表达式n:语句序列语句序列n break;default:语句序列语句序列n+1 break;其中,其中,switch后面后面的表达式的类型必须与的表达式的类型必须与case后面的常量表达式后面的常量表达式的类型一致,而且只能的类型一致,而且只能是字符型、整型或枚举是字符型、整型或枚举型。型。case后面的表达式后面的表达式必须是常量表达式,不必须是常量表达式,不能含有变量能含有变量;同一个同一个switch中不能有重复的常中不能有重复的常量表达式。量表达式。switch语句执行的过程如下:语句执行的过程如下:先先计计算算switch后后面面的的表表达达式式的的值值,然然后后拿拿它它与与各各case后后面面的的常常量量表表达达式式比比较较。当当遇遇到到某某个个case中中的的常常量量表表达达式式的的值值与与它它相相等等时时,就就执执行行那那个个case后后的的语语句句序序列列,直直到到遇遇到到break语语句句或或switch语语句句结结束束时时的的右右花花括括号号“”时时,才才退退出出switch语语句句,去去执执行行switch后后面面的的语语句句。如如果果没没有有一一个个常常量量表表达达式式与与switch后后面面的的表表达达式式值值相相等等,就就执执行行default后后的语句序列。的语句序列。例例4.13 根根据据一一个个代代表表星星期期的的0到到6之之间间的的整整数数,在在屏屏幕幕上上打打印印出它代表的是星期几出它代表的是星期几#include void main()int w;/代表星期的整数代表星期的整数 cout w;switch (w)case 0:cout Its Sunday.endl;break;case 1:cout Its Monday.endl;break;case 2:cout Its Tuesday.endl;break;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:cout Invalid data!endl;default语语句句是是可可以以缺缺省省的的。如如果果没没有有default,则则当当所所有有匹匹配配都都失失败败时时,将将不不执执行行任任何何操操作作。建建议议使使用用default语语句句,除除非非case语语句句已已覆覆盖盖了了所所有有的的可可能能,以以避避免免由由于于没没有有考虑到某种情况而给程序带来的不利影响。考虑到某种情况而给程序带来的不利影响。break语语句句在在switch中中的的作作用用是是跳跳出出整整个个switch语句。语句。在在例例4.13中中,每每个个case的的语语句句序序列列后后都都有有一一个个break语语句句(最最后后一一个个case或或default语语句句的的break可可以以省省略略)。在在这这种种情情况况下下,各各个个case的的排排列列次次序序可可以以是是任任意意,不不会会影影响响程程序序的的结结果果。如如果果没没有有break,则则执执行行完完该该case语语句句的的语语句句序序列列后后,还还将将接接下下去去执执行行后后面面的的case的的语语句句序序列列。在在这这种种情情况况下下,各个各个case排列的次序不同,就可能产生不同的结果。排列的次序不同,就可能产生不同的结果。例例如如,把把例例4.7中中的的break都都删删去去(假假定定输输入入的的w的的值值为为4),会出现什么情况呢?),会出现什么情况呢?如如果果是是在在有有break的的情情况况下下,w应应与与第第五五个个case中中的的常量常量4匹配,从而在屏幕上打印出:匹配,从而在屏幕上打印出:Its Thursday.之之后后就就该该跳跳出出switch,到到达达程程序序末末尾尾并并结结束束。然然而而,没没有有了了break的的switch语语句句得得到到的的结结果果与与原原来来大大不不一一样样。在在打打印印了了上上面面的的字字符符串串后后,并并不不会会跳跳出出switch,而而是是依依次次进进入入后后面面的的case及及default语语句句去去执执行行打打印印语语句句,于于是是得得到到的的输出为:输出为:Its Thursday.Its Friday.Its Saturday.Invalid data!如如果果多多个个case后后的的语语句句序序列列是是相相同同的的,即即要要做做的的操作是一样的,可采用下面的格式以避免重复书写:操作是一样的,可采用下面的格式以避免重复书写:switch (表达式表达式)case 常量表达式常量表达式1:case 常量表达式常量表达式2:case 常量表达式常量表达式i:语句序列语句序列 break;case 常量表达式常量表达式n:语句序列语句序列n break;default:语句序列语句序列n+1 例例4.14 用用switch语句来实现例语句来实现例4.11 include void main()int seniority,s;double wages,allowance;cout seniority;cout wages;s=seniority/10;/得到工龄的十位数字 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;case 3:/工龄在30年49年 case 4:allowance=wages*0.3;break;default:allowance=0;cout The allowance is:allowance endl;C+中中有有三三种种循循环环语语句句可可用用来来实实现现循循环环结结构构:while语语句句、do_while语语句句和和for语语句句。这这些些语语句句各各有有各各的的特特点点,而而且且常常常常可可以以互互相相替替代代。在在编编程程时时应应根根据据题题意意选选择择最最适合的循环语句。适合的循环语句。4.2.3 循环结构循环结构1while语句语句while语句的格式为:语句的格式为:while(条件表达式)(条件表达式)语句语句 /循环体循环体while语句的执行过程:语句的执行过程:(1)对条件表达式求值,如果值为真(非)对条件表达式求值,如果值为真(非0)则执)则执行步骤(行步骤(2),否则转步骤(),否则转步骤(4);(2)执行循环体中的语句)执行循环体中的语句;(3)返回()返回(1);(4)终止循环,去执行)终止循环,去执行while语句的下一语句。语句的下一语句。例例4.15 计算计算100之内的奇数之和之内的奇数之和#includevoid main()int n=1;int sum=0;while (n 100)sum+=n;/累加累加 n+=2;/修改为下一个奇数修改为下一个奇数 cout The sum is:sum endl;#include void main()int seniority;double wages,allowance;cout seniority;/输入第一个人的工龄输入第一个人的工龄 while (seniority!=0)/若工龄不为若工龄不为0则进入循环则进入循环 coutwages;if(seniority=10&seniority=20&seniority=30)allowance=wages*0.3;cout The allowance is:allowance endl;cout seniority;/输入下一人的工龄输入下一人的工龄 例例4.16 将例将例4.12改进为可以重复改进为可以重复计算不同的人的医疗补贴(以计算不同的人的医疗补贴(以输入的工龄为输入的工龄为0作为结束条件)作为结束条件)break语语句句不不仅仅可可用用于于跳跳出出switch语语句句,还还可可用用于于跳跳出出循循环环(包包括括三三种种循循环环语语句句)。但但它它只只能能跳跳出出它它所所在在的的循循环环语语句句或或switch语语句句,不不能能跳跳出出外外层层的的循循环环语语句句或或switch语语句句(如如果果有有的的话话)。若若想想跳跳出出外外层层语语句句,还要在外层中使用还要在外层中使用break。例例4.17 从从键键盘盘接接收收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+;例例4.18 对例对例4.17的改进:遇到负数则忽略并重新输入下一个数据的改进:遇到负数则忽略并重新输入下一个数据#include#includevoid main()int i=1,num;double root;while (i=10)cout num;if(num0)/若num是负数则回到循环开始处 cout valid number!;continue;root=sqrt(num);cout root endl;i+;continue语语句句用用在在循循环环体体中中,它它的的作作用用是是忽忽略略循循环环体体中中位位于于它它之之后后的的语语句句,重重新新回回到到条件表达式的判断。条件表达式的判断。2do_while循环语句循环语句while语语句句的的特特点点是是先先判判断断条条件件,再再确确定定是是否否执执行行循循环环体体,也也即即“先先判判断断,后后执执行行”;如如果果第第一一次次对对条条件件表表达达式式求求值值时时它它就就为为假假,则则循循环环体体就就一次也不被执行。一次也不被执行。do_while语语句句是是先先执执行行一一次次循循环环体体之之后后,再再根根据据条条件件表表达达式式的的值值确确定定是是否否还还要要继继续续执执行行循循环环体体,也也即即“先先执执行行,后后判判断断”,循循环环体体至至少少会会被被执行一次。执行一次。do_while语句的格式为:语句的格式为:do 语句语句 /循环体循环体 while (条件表达式条件表达式);其其中中的的条条件件表表达达式式及及语语句句的的规规定定同同while 语语句句一一样样。注注意意条条件件表表达达式式后后面面的的分分号号不不能能少少,因因为为整整个个do_while语语句句实实际际上相当于一条语句。上相当于一条语句。do_while语句的执行过程如下:语句的执行过程如下:(1)执行一遍循环体)执行一遍循环体;(2)对条件表达式求值,若为真(非对条件表达式求值,若为真(非0)则转步骤)则转步骤(1),否则转步骤(),否则转步骤(3);(3)终止循环,去执行)终止循环,去执行do_while语句的下一语句。语句的下一语句。do_while和和while语语句句在在大大多多数数情情况况下下都都可可以以相相互互替替代代(除除非非是是有有可可能能循循环环体体一一次次也也不不被被执执行行的的情情况况)。例例如如,例例4.9中中是是利利用用while语语句句来来计计算算100之之内内的的奇奇数数之之和和的的,可可以以将将它改写为用它改写为用do_while语句来求和。语句来求和。例例4.19 用用do_while语句来改写例语句来改写例4.15#include void main()int n=1;int sum=0;do sum+=n;/累加累加 n+=2;/修改为下一个奇数修改为下一个奇数 while(n100);cout The sum is:sum endl;例例4.20 根根据据下下面面的的公公式式求求的的值值。计计算算到到最最后后一一项项的的绝绝对对值值小小于于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;coutpi=piendl;3for语句语句 当当循循环环次次数数确确定定的的时时候候,用用 for 语语句句更更为为直直观。观。for语句的格式如下:语句的格式如下:for (表达式表达式1;表达式表达式2;表达式表达式3)语句语句 /循环体循环体 其其中中的的表表达达式式1通通常常用用于于对对循循环环控控制制变变量量进进行行初初始始化化;表表达达式式2用用于于表表示示循循环环是是否否结结束束的的条条件件;表达式表达式3用于对循环控制变量作修改。用于对循环控制变量作修改。for语句执行的过程如下:语句执行的过程如下:(1)对表达式)对表达式1求值求值;(2)对表达式对表达式2求值,若其值为真则执行步骤(求值,若其值为真则执行步骤(3),),否则转步骤(否则转步骤(6);(3)执行循环体执行循环体;(4)对表达式)对表达式3求值求值;(5)转步骤()转步骤(2);(6)结束循环,去执行)结束循环,去执行for语句的下一语句。语句的下一语句。例如:例如:int i;for (i=1;i=10;i+)cout$;程序的运行结果是:程序的运行结果是:$for语语句句也也属属于于“先先判判断断,后后执执行行”的的循循环环语语句句,可以用可以用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.21 用用for语句改写例语句改写例4.19#includevoid main()int sum=0;for (int n=1;n 100;n=n+2)sum+=n;/累加累加 cout The sum is:sum endl;在此例中,将变量在此例中,将变量n的声明及初始化作为的声明及初始化作为for语句的第语句的第一个表达式,这是完全可以的。一个表达式,这是完全可以的。C+的变量可以随时定义,的变量可以随时定义,随时使用。只是定义在不同地方的变量的作用域可能会有所随时使用。只是定义在不同地方的变量的作用域可能会有所不同。比如上例中,如果将变量不同。比如上例中,如果将变量n定义在定义在for语句的前面,它语句的前面,它的作用域就会发生改变。的作用域就会发生改变。4多重循环多重循环 一一个个循循环环的的循循环环体体中中如如果果又又包包含含另另外外的的循循环环,就就构构成成了了循循环环的的嵌嵌套套。前前者者称称为为外外循循环环,后后者者称称为为内内循循环环。根根据据循循环环嵌嵌套套的的重重数数,可可以以有双重循环、三重循环有双重循环、三重循环,统称多重循环。,统称多重循环。例例4.22 分析下面程序的运行结果分析下面程序的运行结果#includevoid main()for(int i=1;i=4;i+)for(int j=1;j=5;j+)couti+j ;cout=73)(x!=y)|(c B)z&y|x y z|y&x y 200*x/y double(x)/y+23 x/y+23 c+y%x x*=int(b/a)+y c c=2|y%-x 0 +x=y?x+:y+*p*y +x-y010012023.623678714 15-1#includevoid main()int x=3,y=5,z=0;int *p=&x;char c=