值相等的标号,并且存在default标号,则从default标号后的语句开始执行,直到switch语句体结束;如果没有与该值相等的标号,同时又没有default标号,则跳过switch语句体,去执行switch语句之后的语句。
4.4.3 在switch语句体中使用break语句
break为C语言关键字,break语句又称间断语句。可以将break语句放在case标号之后的任何位置,通常是在case之后的语句最后加上break语句。每当执行到break语句时,立即跳出 switch语句体。switch语句通常总是和break语句联合使用,使得switch语句真正起到分支的作用。
现用break语句修改例4.6的程序。 #include main() {int g;
printf(“Enter a mark:”);
scanf(“%d”,&g);/* g中存放学生的成绩*/ printf(“g=%d:”,g);
switch (g /10) //此处表达式可能取case语句中表达式的值 { case 10:
case 9:printf(\\n\ case 8:printf(\\n\ case 7:printf(\\n\ case 6:printf(\\n\ default:printf(\\n\ 程序执行过程如下:
(1)当给g输入100时,switch中的表达式:g/10的值为10。因此选择case 10 分支,因为没有遇到 break语句,所以继续执行case 9 分支,在输出:g=100:A之后,遇 break语句,执行 break语句,退出 switch语句体。由此可见,成绩90到100分,执行的是同一分支。 (2)当输入成绩45时,switch中的表达式的值为4,将选择分支default,在输出:g=45:E之后结束switch语句。
(3)当输入成绩为85时,switch中的表达式的值为8,因此选择case 8分支,在输出:9=85:B之后,执行break语句,退出switch语句体。
4.5 语句标号和goto语句 4.5.1语句标号
在C语言中,语句标号不必特意加以定义,标号可以是任意合法的标识符,当在标识符后面加一个冒号,如:flag1:、stop0:,该标识符就成了一个语句标号。注意:在C语言中,语句标号必须是标识符,因此不能简单地使用10:、15:等形式。标号可以和变量同名。 通常,标号用作goto语句的转向目标。如:goto stop;
在C语言中,可以在任何语句前加上语句标号。例如:stop:printf(“END\n”); 4.5.2 goto语句
goto语句称为无条件转向语句,goto语句的一般形式如下:goto 语句标号; goto语句的作用是把程序的执行转向语句标号所在的位置,这个语句标号必须与此goto语句同在一个函数内。滥用goto语句将使程序的流程毫无规律,可读性差,对于初学者来说应尽量不用。 第四章能力点
21 / 26
1、熟练运用if语句以及switch语句的能力; 2、选择结构程序设计的能力;
3、在VC++6.0环境下进行选择结构程序调试的能力。
第5章 循环结构
循环结构是结构化程序设计的三种基本结构之一,在程序设计中对于那些需要重复执行的操作应该采用循环结构来完成,利用循环结构处理各类重复操作既简单又方便。在C语言中有三种可以构成循环结构的循环语句:while、do-while和for。 5.1 while语句和用while语句构成的循环结构 5.1.1 while循环的一般形式
由while语句构成的循环也称“当”型循环,while循环的一般形式如下: while(表达式)循环体 例如: k=0
while(k<10){ printf(“*”);k++;} 程序段将重复输出语句printf,输出10个*号。 说明:
(1)while是C语言的关键字。
(2)while后一对圆括号中的表达式可以是C语言中任意合法的表达式,但不能为空,由它来控制循环体是否执行。
(3)在语法上,循环体只能是一条可执行语句,若循环体内有多个语句,应该使用复合语句。
5.1.2 while循环的执行过程
while循环的执行过程如下:
(1)计算while后圆括号中表达式的值。当值为非0时,执行步骤(2);当值为0时,执行步骤(4)。
22 / 26
(2)执行循环体一次。 (3)转去执行步骤(1)。 (4)退出while循环。
由以上执行过程可知,while后圆括号中表达式的值决定了循环体是否将被执行。因此,进入while循环后,一定要有能使此表达式的值变为0的操作,否则循环将会无限制地进行下去,成为无限循环(死循环)。若此表达式的值不变,则循环体内应有在某种条件下强行终止循环的语句(如break等)。 请初学者注意:
(1)while语句的循环体可能一次都不执行,因为while后圆括号中的条件表达式可能一开始就为0。
(2)在设计循环时,通常应在循环体内改变条件表达式中有关变量的值,使条件表达式的值最终变成0,以便能结束循环。
(3)当循环体需要无条件循环,条件表达式可以设为1(恒真),但是循环体内要带条件的非正常出口(break等)。
5.2 do—while语句和用do—while语句构成的循环结构 5.2.1 do—while语句构成的循环结构 do—while循环结构的形式如下: do 循环体
while(表达式); 例如: do
{ i++;s+=i; }while(i<10); 说明:
(1)do是C语言的关键字,必须和while联合使用。
(2)do—while循环由do开始,至while结束。必须注意的是:在while(表达式)后的“;”不可丢,它表示do—while语句的结束。
(3)while后一对圆括号中的表达式,可以是C语言中任意合法的表达式,由它控制循环是否执行。
(4)按语法,在do和while之间的循环体只能是一条可执行语句。若循环体内需要多个语句,应该使用复合语句。
5.2.2 do—while循环的执行过程
23 / 26
do—while循环的执行过程如下: (1)执行do后面循环体中的语句。
(2)计算while后一对圆括号中表达式的值。当值为非0时,转去执行步骤(1);当值为0 时,执行步骤(3)。
(3)退出do—while循环。
由do—while构成的循环与while循环十分相似,它们之间的重要区别是:while循环的控制出现在循环体之前,只有当while后面条件表达式的值为非0时,才可能执行循环体,因此循环体可能一次都不执行;在do—while构成的循环中,总是先执行一次循环体,然后再求条件表达式的值,因此,无论条件表达式的值是0还是非0,循环体至少要被执行一次。 和while循环一样,在do—while循环体中,一定要有能使while后表达式的值变为0的操作,否则,循环将会无限制地进行下去,除非循环体中有带条件的非正常出口(break等)。
5.3 for语句和用for语句构成的循环结构 5.3.1 for语句构成的循环结构
for语句构成的循环结构通常称为for循环。for循环的一般形式如下: for(表达式1;表达式2;表达式3) 循环体 例如:for (k=0;k<10;k++) printf(“*”); 以上for循环在一行上输入10个*号。 for是C语言的关键字,其后的一对圆括号中通常含有三个表达式,各表达式之间用“;”隔开。这三个表达式可以是任意形式的表达式,通常主要用于for循环的控制,紧跟for(?)之后的循环体在语法上要求是一条语句,若需要多条语句,应该使用复合语句。 for循环的一般形式等价于下面的程序段: 表达式1;
while(表达式2) {
循环体 表达式3 }
5.3.2 for循环的执行过程 for循环的执行过程如下: (1)计算表达式1;
(2)计算表达式2,若其值为非0,转步骤(3);若其值为0,转步骤(5); (3)执行一次for循环体;
(4)计算表达式3,转向步骤(2); (5)结束循环。
24 / 26
5.3.3 有关for语句的说明
(1)for语句中的表达式可以部分或全部省略,但两个“;”不可省略。 例如:for( ; ;) printf(“*”);
三个表达式均省略,但因缺少条件判断,循环将会无限制地执行,而形成无限循环(通常称死循环)。
(2)for后一对圆括号中的表达式可以是任意有效的C语言表达式。 例如:for(sum=0,i=1;i<=100;sum=sum+i,i++){?} 表达式1和表达式3都是一个逗号表达式。
C语言中的for语句书写灵活,功能较强。在for后的一对圆括号中,允许出现各种形式的与循环控制无关的表达式,虽然这在语法上是合法的,但这样会降低程序的可读性。建议初学者在编写程序时,在for后面的一对圆括号内,仅含有能对循环进行控制的表达式,其他的操作尽量放在循环体内去完成。
5.4 循环结构的嵌套
在一个循环体内又完整地包含了另一个循环,称为循环嵌套。前面介绍的三种类型的循环都可以嵌套,循环的嵌套可以多层,但每一层的循环在逻辑上必须是完整的。
在编写程序时,循环嵌套的书写要采用缩进形式,像以下例题程序中所示,内循环中的语句应该比外循环中的语句有规律的向右缩进2~4列,这样的程序层析分明,易于阅读。 5.5 break和continue语句在循环体中的作用 5.5.1 break语句
用break语句可以使流程跳出switch语句体,也可以break语句在循环结构中终止本层循环体,从而提前结束本层循环。
例5 计算S=1+2+3+?+i,直到累加到S大于5000为止,并给出s和i的值。 #include main()
{ int i,s; s=0; for(i=1;;i++) { s=s+i;
if (s>5000) break; }
printf(“s=%d,i=%d\n”,s,i);} 程序的输出结果如下:s=5050,i=100
这是在循环体中使用break语句的示例。上例中,如果没有break语句,程序将无限循环下去,成为死循环。但当i=100时,s的值为100*101/2=5050,if语句中的条件表达式:s>5000 为“真”(值为l),于是执行break语句,跳出for循环,从而终止循环。 break语句的使用说明:
(1)只能在循环体内和switch语句体内使用break语句。
(2)当break出现在循环体中的switch语句体内时,其作用只是跳出该switch语句体,并不能中止循环体的执行。若想强行中止循环体的执行,可以在循环体中,但并不在switch语句中设置break语句,满足某种条件则跳出本层循环体。 5.5.2 continue语句
continue语句的作用是跳过本次循环体中余下尚未执行的语句,立刻进行下一次的循环条件判定,可以理解为仅结束本次循环。注意:执行continue语句并没有使整个循环终止。 在while和do—while循环中,continue语句使得流程直接跳到循环控制条件的测试部分,然后决定循环是否继续进行。在for循环中,遇到continue后,跳过循环体中余下的语
25 / 26
句,而去对for语句中的“表达式3”求值,然后进行“表达式2”的条件测试,最后根据“表达式2”的值来决定for循环是否执行。在循环体内,不论continue是作为何种语句中的语句成分,都将按上述功能执行,这点与break有所不同。 第五章能力点
1、熟练掌握while、do while、for三种循环语句编程的能力; 2、循环结构程序设计的能力;
3、在VC++6.0环境下进行循环结构程序调试的能力。
26 / 26