程序员之程序设计知识点六
发布时间:2010/6/2 15:24:32 来源:城市学习网 编辑:ziteng
3.5 选择结构
选择结构有单分支选择结构、双分支选择结构和多分支选择结构。C语言提供相应的if语句和switCh语句分别用来描述这些选择结构。
1.单分支选择语句
单分支选择语句有以下形式:
if(表达式)
语句
这种形式的语句执行过程是:
(1)计算表达式的值;
(2)测试表达式的值。若表达式的值非0,则执行它的成分语句,并结束单分支选择的执行;若表达式的值为0,则立即结束单分支选择的执行。
2.双分支选择语句
汉分支选择语句有以下形式:
if(表达式)
语句1
else
语句2
双分支选择语句根据给定的选择条件表达式值为非0或为0两种情况,从两个供选择的成分语句中自动选取一个成分语句执行。双分支选择语句的执行过程是:
(1)计算表达式的值;
(2)测试表达式的值并选择执行语句。若表达式的值非0,则执行语句1,并结束双分支选择语句;否则执行语句2,并结束双分支选择语句。
注意;无论条件表达式的值为何值,只能执行语句1或语句2中的一个。当双分文选择语句中的else之后的语句2为空语句时,就变成单分支选择语句。
单分文选择语句和双分支选择语句统称且语句。在if语句中的语句、语句1和语句2可以是任何语句。当它们中的某一个需用语句序列描述时,必须将这语句序列写成复合语句。当它们中的某一个又是if语句时,就呈现嵌套的if语句形式。这时应注意else与if的对应关系。C语言约定else总是与它前面最接近的if对应。
为正确书写if语句,特别说明以下几点:
(1)若if语句中的语句、语句1、语句2是一个简单语句,则这些简单语句之后会有一个分号,这是C语言对这些简单语句的要求。
(2)若if语句中的语句、语句l、语句2要用语句序列(即为顺序结构)来实现,则必须将它们改写成复合语句,即逻辑上把它们变成一个语句。
(3) 在if语句中,每个else总要与它前面的if对应,不可能出现没有对应if的else。
多分支选择语句
多分支选择结构通常有 n(>2)个不同情况和 n+1个供选择的分支。多分支选择结构也可用前叙述的嵌套if语句来描述,但因if语句嵌套深度太多不便于程序编写,也不便于理解,为此C语言专门提供了一种实现多分支选择结构的语句,这就是switCh语句。它的一般形式是:
switeh(表达式){
case常量表达式 1:语句序列 1
case常量表达式 1:语句序列 2
case常量表达式 n:语句序列 n
defalt:语句序列 n+1
}
对switeh语句需说明以下几点:
(1)switch后面括号内的表达式只限于是整型表达式或字符型表达式或枚举型表达式。
(2)case后的常量表达式称为情况前缀,要求所有常量表达式的值互不相同,并与switch后面括号内的表达式值的类型相一致。
(3)语句序列由任意条合法的C语句构成,也可以没有语句。
(4)情况前缀default可以缺省,但至多出现一次,习惯总是将它写在全部情况前缀之后,如有必要也可写在某case之前。
switch语句的执行过程解释如下:
先计算表达式的值,以该值依次与各case之后的常量表达式的值比较,按下列规则,选择执行的入口:
如果表达式的值等于某个常量表达式的值,switch语句就从该常量表达式之后的语句序列的第一个语句开始执行,然后一直向下执行,或自动依次进入后继常量表达式之后的语句序列继续执行(如没有 break语句),或执行完语句序列 n+1,结束 switch语句的执行;或在执行某个语句序列过程中遇到转出该switch语句的语句(如break语句),就停止向下执行,结束switch语句的执行。
如果没有相匹配的常量表达式,就从以default为情况前缀的语句序列开始执行。
如果没有相匹配的常量表达式,也没有defaul情况前缀,则该switch语句的这次执行立即结束。
由上述解释可知,“case常量表达式”只是起语句序列入口的作用。在执行switch语句时,根据switch之后的表达式的值找到与该值匹配的入口,就从此人口处开始执行,只要未遇到转出该switch语句的break语句或goto语句,就一直向下执行,也不再理会经过的case后的常量表达式。
如果要使各种情况互相排斥,仅执行各case所对应的语句序列,最常用的办法是使用break语句,各语句序列都以break语句结束。在switch语句中,执行break语句将使控制转向switch语句的后继语句。
由于switch语句的表达式不允许是实型的,当应用于实型值选择情况时,通常需作以下处理:将实表达式乘上一个适当的比例因子,使较大的实表达式值映照到一个较小的范围上,然后再将它转换到整型。 [NextPage] 循环结构
循环计算用循环结构来描述。C语言提供三种描述不同循环结构的语句,它们是while语句、do-while语句和for语句。
1.while语句
while语句用来描述while型循环结构,它的一般形式为
while(表达式)
语句
while语句的执行过程是:
(1)计算while之后的表达式的值;
(2)测试表达式的值,当值为非 0时,转步骤 3;如值为 0,则结束while语句;
(3)执行while语句的循环体,并转步骤1(从而构成循环)。
一般来说,为使while语句的执行能正常结束,如控制循环的条件表达式包含有变量,循环体的执行应能更新这些变量的值,使表达式的值会变为0。有时,很难直接写出while后的条件,这时可以简单地写上 1,而在循环体中含有当某条件满足时,执行如 break语句那样的控制转移语句,使控制跳出while循环,即呈以下结构形式:
while(1){
...
if(表达式)break;
...
}:
2.do-while语句
do-while语句用来描述do-while型循环结构,它的一般形式为;
do
语句
while(表达式);
其中的语句是do-while语句的循环体。do-while语句的执行过程是:
(1)执行do-while语句的循环体;
(2)求 while之后的表达式的值;
(3)测试表达式的值,当值为非0,转步骤1(从而构成循环);如值为0,则结束do-while语句。
与while语句一样,当循环体由多个语句组成时,必须把它们书写成复合语句。有些用while语句描述的循环计算,也能用do-while语句描述。然而,并非总是如此。两者的重要区别在于:执行循环体时,对作为循环条件的表达式的求值和测试的时间不同。while语句对作为循环条件的表达式求值和测试在执行循环体之前,而do-While语句对作为循环条件的表达式求值和测试在执行循环体之后。对于do-while语句,它的循环体至少被执行一次,而while语句的循环体在作为循环条件的表达式值一开始就为0的情况下,就一次也未被执行。如能保证while语句中的作为循环条件的表达式在第一次被求值后,总是非0,则把该循环条件移至循环体执行之后求值和测试,能起同样的控制作用。在这种情况下,while语句就能改写成如while语句。如 while语句中的作为循环条件的表达式值可能初次求值就为 0时,则它不能简单地改写成do-while语句。另外要特别指出,分号是do-while语句的结束符,不能省略。
for语句
for语句是C语言中最灵活、使用最广泛的循环结构语句。如以最一般意义下考虑循环,一个完整的循环应包含对有关变量赋初值部分、控制循环的条件、一个要循环计算的操作、每次循环后对有关变量的修正等四部分组成。拉语句就是从这一般意义下表达循环结构的语
句。for语句的一般形式为
for(表达式1;表达式2;表达式3)
语句
其中的语句是for语句的循环体。输语句的执行过程是:
(1)计算表达式1;
(2)计算表达式 2的值,并测试其值为 0或非 0。若值为非 0,转步骤 3;否则结束 for语句;
(3)执行循环体;
(4)计算表达式3;
(5)转向步骤2。
for语句的一般形式也可等价地用以下形式的while语句来表达:
表达式1;
while(表达式2) {
语句
表达式3;
}
由for语句的执行过程可知,for语句的表达式1的作用是对控制循环的有关变量赋初值;表达式2是控制循环的条件;表达式3用于修正有关变量;语句是循环体。所以for语句按各部分的功能,可以形象地写成以下形式:
for(赋初值的表达式;控制循环条件的表达式;修正变量的表达式)
完成循环计算的语句
正确使用for语句,需注意以下几种情况:
(1) for语句的一般形式中,表达式1、表达式2和表达式3都可以省略。如表达式1省略,表示该for语句没有赋初值部分,或前面的程序段已为有关变量赋了初值,或确实没有特别的初值;如表达式2省略,表示循环条件永远为真,可能循环体内有控制转移语句转出缺语句;表达式3省略,表示没有修正部分,对变量的修正已在循环体内一起完成。不管表达式1、表达式2和表达式3省略情况如何,其中两个分号都不能省略。对于三个表达式都省略情况,for语句呈以下形式:
for(;;)
语句
(2)表达式l、表达式2和表达式3都可包含逗号运算符由多个表达式组成。
4. break语句
break语句除能用于switch语句外,还常用于循环语句中。执行循环结构中的break语句,控制就从包含它的循环结构中退出。break语句通常与if语句结合,构成一个结束循环的条件。
5.continue语句
continue语句只用于循环语句中。通常复杂的循环计算中,循环语句的循环体是一个语句序列,中间会有一个包含continue语句的且语句。当指定的条件成立时,continue语句就被执行,这时continue语句之后的语句就不再执行,控制立即进入下一轮循环。
6. 语句标号和goto语句
C程序的语句之前都可插入标识符和冒号,该标识符即为其后语句的标号。如
strat:X= 0;
标识符Start就是语句“x=0;”的标号。
goto语句(goto标号;)是一种无条件转移语句,其意义是将程序的控制转到以所指定的标号命名的语句处。goto语句通常出现在if语句内,实现当某种条件出现时,需要改变正常的顺序执行控制流程。由于goto语句过份的随意使用会给程序的理解带来很大的困难,所以一般强调不使用goto语句来编程。只有当一个多重循环的最内层,当发现某种特别的情况需要结束整个多重循环,这时可用goto语句让程序执行从最内层直接转到外层循环之外。注意,break语句只能跳出包含它的一层循环。
7.用goto语句构成循环
在早先非结构化程序设计中,由于语言提供的控制结构的结构性差,常用goto语句构成循环。但在结构化程序中,不再用goto语句构成循环。考生掌握这个知识是要求考生能将goto语句构成的循环改写成结构化控制结构描述的循环。