C表达式和基本程序控制结构_第1页
C表达式和基本程序控制结构_第2页
C表达式和基本程序控制结构_第3页
C表达式和基本程序控制结构_第4页
C表达式和基本程序控制结构_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C表达式和基本程序控制结构4.1运算符与表达式运算符是指用来表示在数据上执行某些特定操作的符号。参与运算的数据称为操作数。(可以分别称为单目、双目和三目运算符)。表达式是指用运算符和圆括号把常量、变量和函数等运算成分连接起来的有意义的式子。单个常量、变量和函数也可以看成是一个表达式。例如:

98.56,(98.56),x,876-78,3*(2.5+5)

都是表达式,基本运算符

基本运算符是指完成算术运算、关系运算、逻辑运算、位运算的运算符。4.1.1算术运算

5.3%2错C++中有如下单目运算符:+-(正负号)C++中有如下双目运算符:+-*/%

5/25.0/28%5??

运算符%的操作数只能是整型或字符型。当赋值运算符的两边出现相同的变量时,C++还提供了一个简洁的表达方式:x=。其中的x可为+、-、*、/、%等。假定e1和e2是表达式,那么

e1=(e1)x(e2)就等价于

e1x=e2例如,表达式

a=a+9可以用+=写成如下形式:

a+=9

注意围绕e2的括号。例如,表达式

y-=x+1实际上是

y=y-(x+1)++和--运算符增1运算符和减1运算符分别对其操作数进行加1和减1操作,它们既可以用在变量前,作为前缀运算符,例如

intm,n;++m;--n;又可用在变量后,作为后缀运算符。例如: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&preincrement4.1.2关系运算C++的关系运算符都是二元的,有>、<、>=、<=、==、!=,分别表示“大于”、“小于”、“大于等于”、“小于等于”、“等于”和“不等于”。由关系运算符连接起来的表达式就称为关系表达式。关系表达式的值只有两个:1和0。1表示逻辑真,即该关系表达式是成立的;0表示逻辑假,即该关系表达式不成立。例如,表达式

6>=4的值为1,而表达式

67!=67的值为0。例4.1关于关系运算的一个例子。

#include<iostream.h>voidmain(){doublex=45.3,y;cout<<"pleaseentery:";cin>>y;cout<<(x<y)<<endl;}例4.1执行后,若输入的y的值是小于45.3的,则得到的结果是1,否则得到0。4.1.3逻辑运算C++的逻辑运算符有三个:一元运算符!(逻辑非)和二元运算符&&(逻辑与)、||(逻辑或)。用逻辑运算符连接起来的表达式称为逻辑表达式。&&运算符用在两个表达式之间,若其左右两边的表达式皆为真(非0),则整个表达式的值为1,否则为0。例如,表达式

(x>10)&&(x<20)例如,当x=14时,上述表达式为1;当x=8时,上述表达式为0。||运算符左右两边的表达式只要有一个为真(非0),整个表达式的值就为1。只有当其左右两边的表达式都为0时,整个表达式的值才为0。例如:

(x<10)||(x>20)当x=36时,此表达式的值为1;x=8时,此表达式的值也为1;x=16时,此表达式的值为0。!运算符用在表达式的前面,表示取表达式的非。若表达式值为0,取非以后为1;若表达式值为非0,取非以后为0。例如:

!(3>2)的值为0,因为(3>2)的值为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=(a>b)?a:b;中,max将赋值为a、b中较大的数。4.1.5运算符的优先级和结合性当一个表达式中有多个运算符时,运算符的优先级和结合性就决定了表达式中各运算的先后顺序。优先级相同时,由结合性决定运算次序。运算符的结合性分为左结合(从左到右计算)和右结合(从右到左计算)。例如,运算符+和-优先级相同、为左结合,因此表达式

45+89-23按从左到右的顺序计算,先做加法再做减法。而赋值运算符=是右结合的,因此表达式

x=y=78的运算次序为:先将78赋给y,再将y赋给x。

表4.1C++常用运算符的优先级和结合性优先级运算符结合性1()->.(类成员访问)[](数组下标)::(作用域访问)左2*(取内容)&(取地址)!++--+(一元)-(一元)sizeof右3*(乘)/%左4+-左5<<>>左6<<=>>=左7==!=左8&&左9||左10?:(条件运算)右11=+=-=*=/=%=<<=>>=&=|=^=右12,左C++各运算符的优先级总的来说有如下规律(按优先级从高到低):一元→二元(除了赋值)→三元→赋值→逗号;二元运算符又有如下规律:算术→关系→逻辑;逻辑运算符有如下规律:!→&&→||。请分析以下表达式的求值次序。假定有

intx=5,y=4,z=6;chara='s',b='t';intw=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.501001101144.2基本程序控制结构按照结构化程序设计的思想,程序由三种单入口、单出口的基本结构组成:顺序结构、选择结构、循环结构。C++的控制流就是这三种基本结构组成的。4.2.1顺序结构顺序结构的程序是指程序中的所有语句都是按书写顺序逐一执行的,只有顺序结构的程序功能有限。例4.2计算球的体积。已知球的体积公式为:

4πR3V=————3#include<iostream.h>voidmain(){floatradius,bulk;cout<<"Pleaseentertheradius:";cin>>radius;//输入半径

bulk=(4*3.1416*radius*radius*radius)/3;cout<<"bulk="<<bulk<<endl;//输出体积}

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

a=b;b=ls;}cout<<a<<""<<b<<endl;}格式二if(条件表达式)语句1else语句2格式二的if语句完成的功能:对条件表达式求值,若值为真(非0)执行其后的语句1;否则执行else后面的语句2。即根据条件表达式是否为真分别作不同的处理。下面用格式二的if语句改写例4.3。例4.4对例4.3的改写。

#include<iostream.h>voidmain(){floata,b,ls;cout<<"Pleaseentertwofloatdatas:";cin>>a>>b;if(a<b)cout<<a<<""<<b<<endl;//先打印a再打印belsecout<<b<<""<<a<<endl;//先打印b再打印a}上一节介绍的条件运算符也可以用if语句来改写。例如:

y=(a<b)?a:b;可以用下面这个if语句来代替:

if(a<b)y=a;elsey=b;条件表达式取值false:0true:所有非0值例4.5某单位向职工按月发放医疗补贴的具体方案如下:职工工龄在10年以下的,医疗补贴为其基本工资的10%;工龄在10年以上20年以下的,医疗补贴为其基本工资的15%;工龄在20年以上30年以下的,医疗补贴为其基本工资的20%;工龄在30年以上的,医疗补贴为其基本工资的30%。输入某职工的工龄及基本工资,计算他每月应得的医疗补贴。#include<iostream.h>voidmain(){intseniority;doublewages,allowance;cout<<"Pleaseentertheyearsofservice:";cin>>seniority;//输入工龄

cout<<"Pleaseenterthebasicwages:";cin>>wages;//输入基本工资

if(seniority<10)//工龄在10年以下

allowance=wages*0.1;elseif(seniority<20)//工龄在10年~19年

allowance=wages*0.15;elseif(seniority<30)//工龄在20年~29年

allowance=wages*0.2;elseallowance=wages*0.3;//工龄在30年以上

cout<<"Theallowanceis:"<<allowance<<endl;}if语句中也可以包含if语句,这就构成了if语句的嵌套。例4.5也可以不使用嵌套的if语句。借助逻辑运算符,用几个并列的if语句来完成例4.5的功能:例4.6对例4.5的改写。

#include<iostream.h>voidmain(){

intseniority;doublewages,allowance;cout<<"Pleaseentertheyearsofservice:";cin>>seniority;cout<<"Pleaseenterthebasicwages:";cin>>wages;if(seniority<10)allowance=wages*0.1;if(seniority>=10&&seniority<20)allowance=wages*0.15;if(seniority>=20&&seniority<30)allowance=wages*0.2;if(seniority>=30)allowance=wages*0.3;cout<<"Theallowanceis:"<<allowance<<endl;}二义性原与最近匹配原则在将两种格式的if语句混合起来进行嵌套时,要注意正确理解其含义。请看下面的语句:

x=9;if(x>2)if(x<4)x=35;elsex=78;cout<<x<<endl;其中的if语句可以有两种理解。其一理解为:

if(x>2){if(x<4)x=35;}elsex=78;其二理解为:

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

switch(表达式){case常量表达式1:

语句序列1break;case常量表达式2:

语句序列2break;……case常量表达式n:

语句序列nbreak;default:

语句序列n+1break;}其中,switch后面的表达式的类型必须与case后面的常量表达式的类型一致,而且只能是字符型、整型或枚举型(注意不能是浮点型);case后面的表达式必须是常量表达式,不能含有变量;同一个switch中不能有重复的常量表达式。switch语句执行的过程如下:先计算switch后面的表达式的值,然后拿它与各case后面的常量表达式比较。当遇到某个case中的常量表达式的值与它相等时,就执行那个case后的语句序列,直到遇到break语句或switch语句结束时的右花括号“}”时,才退出switch语句,去执行switch后面的语句。如果没有一个常量表达式与switch后面的表达式值相等,就执行default后的语句序列。#include<iostream.h>voidmain(){intw;//代表星期的整数

cout<<"Pleaseenterthenumberofweek:";cin>>w;switch(w){case0:cout<<"It'sSunday."<<endl;break;case1:cout<<"It'sMonday."<<endl;break;case2:cout<<"It'sTuesday."<<endl;break;例4.7根据一个代表星期的0到6之间的整数,在屏幕上打印出它代表的是星期几。case3:cout<<"It'sWednesday."<<endl;break;case4:cout<<"It'sThursday."<<endl;break;case5:cout<<"It'sFriday."<<endl;break;case6:cout<<"It'sSaturday."<<endl;break;default:cout<<"Invaliddata!"<<endl;}}default语句是可以缺省的。如果没有default,则当所有匹配都失败时,将不执行任何操作。建议使用default语句,除非case语句已覆盖了所有的可能,以避免由于没有考虑到某种情况而给程序带来的不利影响。break语句在switch中的作用是跳出整个switch语句。在例4.7中,每个case的语句序列后都有一个break语句(最后一个case或default语句的break可以省略)。在这种情况下,各个case的排列次序可以是任意,不会影响程序的结果。如果没有break,则执行完该case语句的语句序列后,还将接下去执行后面的case的语句序列。在这种情况下,各个case排列的次序不同,就可能产生不同的结果。例如,把例4.7中的break都删去(假定输入的w的值为4),会出现什么情况呢?。如果是在有break的情况下,w应与第五个case中的常量4匹配,从而在屏幕上打印出:

It'sThursday.之后就该跳出switch,到达程序末尾并结束。然而,没有了break的switch语句得到的结果与原来大不一样。在打印了上面的字符串后,并不会跳出switch,而是依次进入后面的case及default语句去执行打印语句,于是得到的输出为:

It'sThursday.It'sFriday.It'sSaturday.Invaliddata!如果多个case后的语句序列是相同的,即要做的操作是一样的,可采用下面的格式以避免重复书写:

switch(表达式){case常量表达式1:case常量表达式2:case常量表达式i:

语句序列

break;……case常量表达式n:

语句序列nbreak;default:

语句序列n+1}#include<iostream.h>voidmain(){intseniority,s;doublewages,allowance;cout<<"Pleaseentertheyearsofservice:";cin>>seniority;cout<<"Pleaseenterthebasicwages:";cin>>wages;s=seniority/10;//得到工龄的十位数字

switch(s){case0://工龄在10年以下

allowance=wages*0.1;break;case1://工龄在10年~19年

allowance=wages*0.15;break;case2://工龄在20年~29年

allowance=wages*0.2;break;例4.8用switch语句来实现例4.5。这个程序是按工龄不会超过49年来设计的。由于switch不能象if语句那样可以进行大于、小于等判断,而只能判断是否相等,因此程序中取工龄的十位数字作为switch表达式。case3://工龄在30年~49年case4:allowance=wages*0.3;break;default:allowance=0;}cout<<"Theallowanceis:"<<allowance<<endl;}4.2.3循环结构C++中有三种循环语句可用来实现循环结构:while语句、do_while语句和for语句。这些语句各有各的特点,而且常常可以互相替代。在编程时应根据题意选择最适合的循环语句。1.while语句while语句的格式为:例4.9计算100之内的奇数之和。

#include<iostream.h>voidmain(){

intn=1;//奇数

intsum=0;//奇数的累加和

while(n<100){//n不能超过100sum+=n;//累加

n+=2;//修改为下一个奇数

}cout<<"Thesumis:"<<sum<<endl;}while语句的执行过程:⑴对条件表达式求值,如果值为真(非0)则执行步骤⑵,否则转步骤⑷;⑵执行循环体中的语句;⑶返回⑴;⑷终止循环,去执行while语句的下一语句。while(条件表达式)语句//循环体例4.10将例4.6改进为可以重复计算不同的人的医疗补贴。以输入的工龄为0作为结束条件。

#include<iostream.h>voidmain(){

intseniority;doublewages,allowance;cout<<"Pleaseentertheyearsofservice:";cin>>seniority;//输入第一个人的工龄

while(seniority!=0){//若工龄不为0则进入循环

cout<<"Pleaseenterthebasicwages:";cin>>wages;if(seniority<10)allowance=wages*0.1;if(seniority>=10&&seniority<20)allowance=wages*0.15;if(seniority>=20&&seniority<30)allowance=wages*0.2;if(seniority>=30)allowance=wages*0.3;cout<<"Theallowanceis:"<<allowance<<endl;cout<<"Pleaseentertheyearsofservice:";cin>>seniority;//输入下一人的工龄

}}break语句不仅可用于跳出switch语句,还可用于跳出循环(包括三种循环语句)。但它只能跳出它所在的循环语句或switch语句,不能跳出外层的循环语句或switch语句(如果有的话)。若想跳出外层语句,还要在外层中使用break。例4.11从键盘接收10个整数,求它们的平方根。若遇到负数就终止程序。#include<iostream.h>#include<math.h>voidmain(){inti=1,num;doubleroot;while(i<=10){cout<<"Pleaseenteranumber:";cin>>num;if(num<0)//若num是负数则退出循环

break;root=sqrt(num);cout<<root<<endl;i++;}}

这个程序有两个出口。每个输入的数在计算其平方根之前都要判断它的正负,若为负数就退出循环,这是一个出口。另外,整型变量被用来实现记数。i的初值为1,每执行一次循环体就将它的值加1,当它的值为11时,表示循环体已经执行了10次,于是循环终止。这是第二个出口。这样的程序可读性较差。例4.12对例4.11的改进:遇到负数则忽略并重新输入下一个数据。

#include<iostream.h>#include<math.h>voidmain(){inti=1,num;doubleroot;while(i<=10){cout<<"Pleaseenteranumber:";cin>>num;if(num<0){//若num是负数则回到循环开始处

cout<<"validnumber!";continue;}root=sqrt(num);cout<<root<<endl;i++;}}continue语句用在循环体中,它的作用是忽略循环体中位于它之后的语句,重新回到条件表达式的判断。2.do_while循环语句while语句的特点是先判断条件,再确定是否执行循环体,也即“先判断,后执行”;如果第一次对条件表达式求值时它就为假,则循环体就一次也不被执行。do_while语句是先执行一次循环体之后,再根据条件表达式的值确定是否还要继续执行循环体,也即“先执行,后判断”,循环体至少会被执行一次。do_while语句的格式为:

do

语句//循环体

while(条件表达式);其中的条件表达式及语句的规定同while语句一样。注意条件表达式后面的分号不能少,因为整个do_while语句实际上相当于一条语句。do_while语句的执行过程如下:⑴执行一遍循环体;⑵对条件表达式求值,若为真(非0)则转步骤⑴,否则转步骤⑶;⑶终止循环,去执行do_while语句的下一语句。do_while和while语句在大多数情况下都可以相互替代(除非是有可能循环体一次也不被执行的情况)。例如,例4.9中是利用while语句来计算100之内的奇数之和的,可以将它改写为用do_while语句来求和。例4.13用do_while语句来改写例4.9。

#include<iostream.h>voidmain(){intn=1;//奇数

intsum=0;//奇数的累加和

do{sum+=n;//累加

n+=2;//修改为下一个奇数

}while(n<100);cout<<"Thesumis:"<<sum<<endl;}例4.14根据下面的公式求π的值。计算到最后一项的绝对值小于10-6时停止。

π/4=1–1/3+1/5–1/7

#include<ios

温馨提示

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

评论

0/150

提交评论