《计算机二级C语言第4章选择结构.ppt》由会员分享,可在线阅读,更多相关《计算机二级C语言第4章选择结构.ppt(43页珍藏版)》请在三一办公上搜索。
1、第4章 选择结构,本章要点:4.1 关系运算和逻辑运算4.2 if语句和用if语句构成的选择结构4.3 条件表达式构成的选择结构4.4 switch语句以及用switch语句和break语句构成的选择结构4.5 语句标号和goto语句,4.1 关系运算和逻辑运算,4.1.1 C语言中的逻辑值C语言中,参与逻辑运算的量为非零值或整数零,非零值和整数零分别表示运算量为“真”或“假”。逻辑运算的结果值,即逻辑表达式的值应该是一个逻辑值“真”或“假”。C语言编译系统在给出逻辑运算结果时,以数值1代表“真”,以0代表“假”,但在判断一个量是否为“真”时,以0代表“假”,以非0代表“真”。,4.1.2 关
2、系运算符和关系表达式关系运算实际上就是“比较运算”,将两个数进行比较,判断比较的结果是否符合指定的条件。1关系运算符关于关系运算符的说明:(1)表4-1中前4种运算符(、=)的优先级别相同,后两种也相同。前4种优先级别高于后两种。如,“”优先级别高于“!=”。(2)关系运算符与算术运算符、赋值运算符的优先级关系如下:算术运算符(高)关系运算符(中)赋值运算符(低)即:算术运算符优先级别高于关系运算符,关系运算符优先级别又高于赋值运算符。(3)关系运算符的结合方向是“自左向右”。,C语言有六种关系运算符,如表4-1所示。表4.1 C语言中的关系运算符,2关系表达式及关系表达式的值用关系运算符将两
3、个表达式(算术表达式、关系表达式、逻辑表达式、赋值表达式、字符表达式等)连接起来的式子,称关系表达式。例如,a=b,a=c等。在C语言中,关系表达式的结果值为1或0。当关系表达式成立时,其结果值为1,否则,其值为0。若a=10,b=6,表达式a=b为“真“,其值为1。当关系运算符两边的值类型不一致时,系统将自动进行转换。转换规则与双目运算中的类型转换规则相同。,关系运算示例:试求x=531的值。分析:x=531相当于:x=(53)1=11=0故x的值为0。关系表达式主要用于选择结构中的条件判断。重点提示:表示“等于”关系的运算符“=”和“不等于”关系的运算符“!=”与数学中的表示方法不同。在使
4、用它们时请予以注意,以免写错关系运算符而导致错误的结果。例如,欲判断x是否等于0,如果写成:x=0就不是判断x是否等于0的含义了,而成了把0赋值给变量x。正确的写法应为:x=0。,4.1.3 逻辑运算符和逻辑表达式1C语言中的逻辑运算符关系表达式只适于描述单一的条件,对于较复杂的复合条件就需要将若干个关系表达式连接起来才能描述,如描述“x大于0且不等于2”,就需要将两个关系表达式x0和x!=2连接起来:x0&x!=2。其中“&”是C语言中的逻辑运算符。C语言提供了三种逻辑运算符,如表4.2所示。,表4.2 C语言中的逻辑运算符,关于逻辑运算符的说明:(1)逻辑运算符的优先次序如下:!(高)&(
5、中)|(低)(2)逻辑运算符具有自左向右的结合性(3)逻辑运算符与赋值运算符、关系运算符、算术运算符的优先次序如下:(由高到低)!(逻辑非)算术运算关系运算&(逻辑与)|(逻辑或)赋值运算,例如:a=b)&(xy)可以写为:a=b&xy(a=b)|(x=y)可以写为:a=b|x=y(!a)|(a=b)可以写为:!a|a=b2逻辑表达式和逻辑表达式的值用逻辑运算符将关系表达式或逻辑值连接起来的式子称逻辑表达式。一个逻辑表达式中可以包含多个逻辑运算符,如xy&a=b-!c参与逻辑运算的量为非零值或整数零,非零值和整数零分别表示运算量为“真”或“假”。逻辑运算的结果值,即逻辑表达式的值应该是一个逻辑
6、值“真”或“假”,即为“1”或“0”。,表4.3为逻辑运算的运算规则表。用它表示当a和b的值为不同组合时,各种逻辑运算所得到的值。,以下是关于逻辑运算的几点说明:(1)参与逻辑运算的量不但可以是0和1,或者是0和非零的整数,也可以是任何类型的数据,如字符型、实型或指针型等。但最终以0和非0来判定它们属于“真”或“假”。(2)在逻辑表达式求解中,并不是所有逻辑运算符都需要执行,有时只需执行一部分运算符就可得出逻辑表达式的最后结果。例如x&y&z,只有x为真时才需要判断y的真假,若x为假,则立即得出整个表达式为假。(3)逻辑表达式的运用场合与关系表达式完全相同,也是用于流程控制语句中的条件描述。只
7、不过,关系表达式描述的是单一的条件,逻辑表达式描述的是复合的条件。,(4)在处理一个复杂表达式时,对于表达式中不同位置上出现的数值,应区分哪些是作为数值运算或关系运算的对象,哪些作为逻辑运算的对象。例如求下列表达式的值:8=5&2|6=5,在关系运算符=两侧的8和5作为数值参加关系运算,8=5的值为1。再进行1&2|65-!0运算。自左至右扫描求解,&两侧的1和2作为逻辑运算对象,因为参加运算的皆为非0,故结果为1。接下来进行1|65-!0运算。6的左侧为|运算符,右侧为运算符,根据优先级别,应先进行的运算。即先进行65-!0运算。现在5的左侧为运算符,右侧为-运算符,而-优先于,因此,应先进
8、行5-!0的运算。又由于!的优先级别最高,故先进行!0的运算,得结果1。,然后进行5-1运算。得结果为4。下面再进行64运算。得结果为0。最后进行1|0运算。得到1。故表达式的值为1。重点提示:在逻辑表达式求解中,并不是所有逻辑运算符都需要执行,有时只需执行一部分运算符就可得出逻辑表达式的最后结果。,4.2 if语句和用if语句构成的选择结构4.2.1 if语句if语句是选择结构的一种形式,又称为条件分支语句。它的流程控制方式是:根据给定的条件进行判定,由判定的结果(真或假)决定执行给出的两种操作之一。C语言中提供了三种形式的if语句:不含else的if语句、ifelse语句和ifelseif
9、语句。1不含else的if语句,(1)语句形式如下:if(表达式)语句圆括号中的表达式一般是关系表达式或逻辑表达式,用于描述选择结构的条件,但也可以是其他任意的数值类型表达式,包括整型、实型、字符型等。如果在if子句中需要多个语句,则应该使用大括号“”把一组语句组成复合语句。(2)执行过程首先计算if后面圆括号中的表达式的值,若为非0值,则执行语句1,然后脱离本选择结构,继续执行if语句的下一个语句;否则不执行语句1,直接转去执行if语句的下一个语句。,图4-1 if语句程序流程图,图4.2 if-else语句执行过程,2if-else语句(1)语法形式如下:if(表达式)语句1;else 语
10、句2;语句1称为if子句,语句2称为else子句,这些子句只允许是一条语句,若需要多条语句时,则应该使用“”将这些语句括起来组成复合语句。另外要注意,else不是一条独立的语句,它只是if语句的一部分,因此在程序中else必须与if配对。(2)执行过程首先计算圆括号内的表达式值,若为非0值,则执行语句1,然后脱离本选择结构,继续执行if语句的下一个语句;否则执行语句2,然后脱离本选择结构,继续执行if语句的下一个语句。,3if-else-if语句(1)语法形式如下:if(表达式1)语句1;else if(表达式2)语句2;else if(表达式3)语句3;else if(表达式n-1)语句n-
11、1;else 语句n;,(2)执行过程若表达式1为真,执行语句1,否则进行下一步判断;若表达式2为真,执行语句2,否则进行下一步判断;最后所有表达式都为假时,执行语句n。if-else-if语句的执行过程如图4-3所示。,重点提示:使用ifelseif语句时,请注意各个分支结构的条件一定要按照某种顺序书写。这样做不仅使程序条理清晰,而且能使条件书写简捷,不易出错。,4.2.2 嵌套的if语句在if语句中又包含一个或多个if语句称为if语句的嵌套。以下是C语言中ifelse语句的二重嵌套的三种形式。(1)在if子句中嵌套具有else子句的if语句,如图4.4(a)所示(2)在if子句中嵌套不含e
12、lse子句的if语句,如图4.4(b)所示(3)在else子句中嵌套if语句,如图4.4(c)所示。,图4.4 嵌套的if语句结构,如果把嵌套写成如下形式:if(表达式1)if(表达式2)语句1;else语句2;程序设计者把else与第一个if书写在同一列,试图以此表示它们的匹配的。但是,根据if和else配对规则,else却是与第二个if配对(因为离它最近)。由此可见,C语言不是以书写格式来分隔语句的,而是由逻辑关系决定的。当if和else的数目不等时,为了保险起见,也可以用一对大括号括起来确定配对关系。,可作如下处理:if(表达式1)if(表达式2)语句1;else语句2;,例如:从键盘输
13、入两个整数,试比较它们的大小。main()int a,b;printf(Please enter two integers:n);scanf(%d,%d,程序运行结果为:Please enter two integers:3,5739-6Please enter two integers:456,456456=456里层的ifelse语句是外层条件语句if下的嵌套语句,它虽然占据多个书写行,却不是复合语句,可以作为一个语句看待,因此无须用一对大括号括起来。重点提示:在嵌套内的if语句既可以是if语句形式也可以是ifelse语句形式,这就会出现多个if和多个else重叠的情况。此时要特别注意if
14、和else的配对问题。if和else配对规则为:else总是与它前一个最近的if配对。,4.3 条件表达式构成的选择结构对于有些选择分支结构,C语言另外还提供了一个特殊的运算符条件运算符,由此构成的表达式也可以形成简单的选择结构,这种选择结构能以表达式的形式内嵌在允许出现表达式的地方,使得可以根据不同的条件使用不同的数据参与运算。,1条件运算符条件运算符由两个符号“?”和“:”组成,要求有3个操作对象,称三目(元)运算符,它是C语言中唯一的三目运算符。2条件表达式条件表达式的一般形式为:表达式1?表达式2:表达式3,它的执行过程如图4.5所示。以下是几点说明:(1)通过情况下,表达式1是关系表
15、达式或逻辑表达式,用于描述条件表达式中的条件,表达式2和表达式3可以是常量、变量或表达式。(2)条件表达式的执行顺序为:先求解表达式1,若值为非0,表示条件为真,则求解表达式2,此时表达式2的值就作为整个条件表达式的值;若表达式1的值为0,表示条件为假,则求解表达式3,表达式3的值就是整个条件表达式的值。,(3)在程序中,通过把条件表达式的值直接赋予某个变量。例如:min=(a0?1:x0?1:(x0?-1:0)。,其作用是判断x的符号情况。当x为正数时,该条件表达式的值为1;当x为负数时,该条件表达式的值为-1;当x为0时,该条件表达式的值为0。(7)条件表达式不能取代一般的if语句,仅当i
16、f语句中内嵌的语句为赋值语句(且两个分支都给同一变量赋值)时才能代替if语句。(8)表达式1、表达式2、表达式3的类型可以不同。此时条件表达式的值的类型为它们中较高的类型。,重点提示:条件表达式的执行顺序为:先求解表达式1,若值为非0,则此时表达式2的值就作为整个条件表达式的值;反之,则表达式3的值就是整个条件表达式的值。,4.4 switch语句以及用switch语句和break语句构成的选择结构,4.4.1 switch语句通过前面的讨论我们知道,if语句处理两个分支,处理多个分支时需使用ifelseif结构,但如果分支较多,则嵌套的if语句层数就越多,程序不但冗长而且理解也比较困难。因此
17、,C语言又提供了一种专门用于处理多分支结构的条件选择语句,称为switch语句,又称开关语句。,使用switch语句直接处理多个分支(当然包括两个分支)。其一般形式为:switch(表达式)case 常量表达式1:语句1;break;case 常量表达式2:语句2;break;case 常量表达式n:语句n;break;default:语句n+1;break;,说明:(1)switch、case、break、default均为C语言的保留字。(2)swich的表达式通常是一个整型或字符型变量,也允许是枚举型变量,其结果为相应的整数、字符或枚举常量。(3)常量表达式又称为开关常数,必须是与表达式
18、对应一致的整数、字符或枚举常量。(4)语句1至语句n,可以是简单语句,也可以是复合语句。(5)在关键字case和常量表达式之间一定要有空格。重点提示:在switch语句中,default以及break是可以有也可以没有的,且case语句标号后的语句也可以省略不写。,4.4.2 switch执行过程switch语句的执行流程是:首先计算switch后面圆括号中表达式的值,然后用其结果依次与各个case的常量表达式相比较,若圆括号中表达式的值与某个case后面的常量表达式的值相等,就执行此case后面的语句,执行后遇break语句就退出switch语句;若圆括号中表达式的值与所有case后面的常量
19、表达式的值都不相同,则执行default后面的语句n+1,执行后退出switch语句,退出后程序流程转向开关语句的下一个语句。,图4.6 switch语句的执行过程,例如,下面的switch语句可以根据键入考试成绩的等级(grade)输出百分制分数段:键入A,输出85100键入B,输出7084键入其他任意字符,输出errorswitch(grade)caseA:printf(85100n);break;caseB:printf(7084n);break;default:printf(errorn);,注意:(1)在switchcase语句中,各个case常量表达式不一定要按其值的大小顺序来书写
20、语句,但要求各个case后的常量表达式必须是不同的值,以保证分支选择的唯一性。例如:switch(ch)caseA:语句1;break;caseB:语句2;break;caseA:语句2;break;default:语句3;该例中前2个case语句都是合法的,当变量ch取A、B时,分别执行语句1、2,但最后一条case语句与第一条case语句的常量表达式的值相同,这是不允许的。,(2)如果在case后面包含多条执行语句时,也不需要加大括号,进入某个case后,会自动顺序执行本case后面的所有执行语句。(3)default总是放在最后,这时,default后不需要break语句。并且,defa
21、ult部分也不是必须的,如果没有这一部分,当switch后面圆括号中表达式的值与所有case后面的常量表达式的值都不相等时,则不执行任何一个分支直接退出switch语句。此时,switch语句相当于一个空语句。例如,将上面例子中switch语句中的default部分去掉,则当输入的字符不是“A”、“B”、时,此switch语句中的任何一条语句也不被执行。,(4)在switchcase语句中,多个case可以共用一条执行语句,例如:case A:case B:printf(60n);break;在A、B两种情况下,均执行相同的语句,即输出“60”。(5)在switch语句中,只有最后一个分支(d
22、efault)中的break语句的存在于否不影响执行结果。因为没有这个break语句,执行该分支的所有语句后也会自动退出switch语句。而其余各分支中的break语句有与无时的流程是完全不同的。例如在上例中,如果caseA、B后面没有break语句,则当grade=A时,程序从printf(85100n)开始执行,输出结果为:85100 7084 error,这是因为case后面的常量表达式实际上只起语句标号作用,而不起条件判断作用,即“只是开始执行处的入口标号”。因此,一旦与switch后面圆括号中表达式的值匹配,就从此标号处开始执行,而且执行完一个case后面的语句后,若没遇到break
23、语句,就自动进入下一个case继续执行,而不再判断是否与之匹配,直到遇到break语句才停止执行,退出break语句。因此,若想执行一个case分支后立即跳出switch语句,就必须在此分支的最后添加一个break语句。重点提示:在switch语句中,default总是放在最后,这时,default后不需要break语句。因此只有最后一个分支(default)中的break语句的存在于否不影响执行结果。,4.5 语句标号和goto语句,4.5.1 语句标号在C语言中,语句标号不必特殊加以定义,标号可以是任意合法的标识符,当在标识符后面加一个冒号,该标识符就成为一个语句标号。如student:等。注意,C语言中,语句标号必须是标识符,而不能是数值常量形式,标号可以和变量同名。通常,标号用作goto语句的转向目标。如:goto state;C语言中,可以在任何语句前加上语句标号,如:state:printf(“endn”);,4.5.2 goto语句goto语句称为无条件转向语句,goto语句的一般形式为:goto 语句标号goto语句的作用是把程序的执行转向语句标号所在的位置,这个语句标号必须与此goto语句同在一个函数内。重点提示:滥用goto语句将使得程序的流程毫无规律,可读性差,对于初学者来说应尽量不采用。,
链接地址:https://www.31ppt.com/p-4995607.html