在实际问题中,常常需要进行大量的重复处理,而循环结构可以让计算机反复执行同一段代码,从而完成大量雷同的计算。利用循环结构进行程序设计,一方面降低了问题的复杂性,减少了程序设计的难度;另一方面也充分发挥了计算机自动执行程序、运算速度快的特点。 实际应用中的许多问题都会涉及重复执行的一些操作,如级数求和、穷举或迭代求解等。若需要重复处理的次数是已知的,则为计数控制循环。若重复处理的次数是未知的,是由给定条件控制的,称为条件控制循环。 循环结构通常有两种类型:一种是当型循环,另一种是直到型循环。C语言提供了for、while、do…while 3种循环语句来实现循环结构。
while 语句
由while语句构成的循环称为while循环,while循环是当型循环。它的一般格式如下: while (表达式) {循环体语句} 执行过程:首先计算控制表达式的值。如果值不为“0”(即真值),那么执行循环体,接着再次判定表达式的值。这个过程(先判定控制表达式的值,在执行循环体)持续进行,直到控制表达式的值为“0”才停止。
注 (1)while后一对圆括号中的表达式称为循环条件,由它控制循环是否执行,它可以是C语言中任意合法的表达式。 (2)循环体语句可以是一条语句,也可以是由“{ }”括起来的多条语句。
do...while 语句
由do…while语句构成的循环称为do...while 循环,这是一种直到型循环。do...while语句的特点是先执行循环体,后判断循环条件是否成立。其一般格式如下: do { 循环体语句 }while(表达式) do...while循环结构执行的过程:先执行循环体语句一次,然后判断条件表达式是否成立,若为“真”(非0),则表示循环条件满足,继续执行循环体语句块。如此重复循环,直至表达式的值为“假”(0),退出循环,在执行后继语句。
注 (1)do是C语言的关键字,必须与while联合使用。 (2)与while语句不同,do...while语句从do开始,到while结束。因此,while(表达式)后的分号(;)不能缺少。而while语句中while(表达式)后若加分号,则表示循环体语句。
for语句
由for语句构成的循环通常称为for循环,它是一种当型循环。C语言中的for语句是使用最灵活的,不仅可以用于循环次数已经确定的情况,还可以用于循环次数不确定只给出循环结束条件的情况。它完全可以代替while语句。for循环语句的一般格式如下: for(表达式1;表达式2;表达式3) { 循环体语句 } 其中,for是C语言的关键字,其后圆括号内通常有3个表达式,主要用于for循环控制。表达式之间用分号隔开,表达式是C语言中任何合法的表达式。一般情况下,表达式1为循环变量赋初值;表达式2是循环条件;表达式3用于修该循环变量值。for下面的语句为循环体。循环体多于一个语句时,要用复合语句表示。 for循环执行过程如下: (1)计算表达式1的值。 (2)计算表达式2的值。若表达式2的值为“真”(非0),则执行步骤(3);若表达式2的值为“假”(0),则执行步骤(5)。 (3)执行循环体语句。 (4)执行表达式3,然后返回步骤(2)。 (5)for循环结束,执行循环结构后面的语句。
说明: (1)for循环中的表达式1、表达式2和表达式3都是可选项,可以省略,但“;”不能省略,例如for(;;)。 (2)省略表达式1,表示不对循环变量赋初值,例如: i=1; for( ;i<=n;i++) sum=sum+i; (3)若省略表达式2,则取消了结束循环的条件。此时,如果循环体中没有终结循环的处理,便形成了死循环,例如: for(i=1; ;i++) sum=sum+i; (4)若省略表达式3,则不对循环控制变量进行操作,这是可在循环体语句中加入修改控制变量的语句,例如: for(i=1;i<=n; ) { sum=sum+i; i++; } (5)表达式1可以是设置循环变量初值的赋值表达式,也可以是其他表达式,例如: i=1; for(sum=0;i<=n;i++) sum=sum+i; (6)表达式1和表达式3可以是逗号表达式,例如: for(i=1,sum=0;i<=n;sum=sum+i,i++); (7)表达式2也可以是数值表达式或字符表达式,只要其值非零,就可以执行循环体,例如: for( ;(c=getcher())!='\n';) printf("%c",c);
3种循环语句的比较
while、do...while、for3种循环语句都可以实现循环结构程序设计,这3种语句有哪些区别呢?我们在设计循环结构程序时应该怎样选择恰当的循环语句呢? (1)3种循环语句都可以用于处理同一个问题,一般情况下它们可以互相代替。 (2)当使用while和do...while循环语句时,循环变量初始化的操作应该在while和do...while语句之前完成,而for循环语句可以在表达式1中实现循环变量的初始化。 (3)while和do...while循环语句只在while后面指定循环条件,在循环体中应包含使循环结束的语句。 (4)do...while循环语句和while循环语句的区别在于:do...while是先执行后判断,因此do...while至少要执行一次循环体;而while是先判断后执行,如果条件不满足,则可能一次循环体语句也不执行。 (5)for循环语句可以在表达式3中包含使循环趋于结束的语句,甚至可以将循环体中的操作放到表达式3中。因此,for语句的功能最强,凡用while和do...while循环语句完成的操作,均可以用for循环语句实现。
循环的嵌套
一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。所谓“包含”是指一个循环结构完全在另一个循环结构的里面。通常把里面的循环称为“内循环”,外面的循环称为“外循环”。3种循环结构可以互相嵌套,但是层次要清楚,不能出现交叉。例如,以下几种都是合法的形式:
流程的转移控制
C语言提供的转移控制语句,除了前面介绍的if...else语句、switch语句、while语句、do…while语句、for语句外,还有goto语句、break语句和continue语句,它们主要用于控制程序的转向。在结构化程序设计中,要限制goto语句的使用。对于break语句和continue语句要深刻理解他们在循环语句中的应用。
goto语句
goto语句为无条件转向语句,它使系统转向标号所在的语句行执行。其一般格式如下: goto 语句标号; 语句标号用标识符表示,它的命名规则与变量的命名规则相同,即由字母、数字和下划线组成。其第一个字符必须为字母或下划线,不能用整数来作标号。 结构化程序设计方法主张限制使用goto语句,因为滥用goto语句将使程序流程无规律、可读性差。但是,也不会绝对禁止使用goto语句。一般来说,goto语句有以下两种用途。 (1)与if语句一起使用,构成循环结构。 (2)从循环体中跳转到循环体外,但在C语言中break语句和continue语句跳出本层循环和结束本次循环。goto语句的使用机会已大大减少,只有需要从多层循环的内层循环直接跳出时才用到goto语句。但是这种用法不符合结构化规则,一般不宜采用。
break语句
break语句可以跳出switch结构,继续执行switch语句下面的一个语句。实际上,break语句还可以用于从循环体内跳出循环体,即提前结束循环,然后继续执行循环体后面的语句。 break语句的一般格式如下: break; break语句在循环结构中的功能是终止当前的循环,转向后续语句执行。下面给出各种循环语句中break语句的执行流程:
break语句不能用于循环语句和switch语句之外的任何其他语句中。
continue语句
continue语句的一般格式如下: continue; continue语句只能用在循环结构中,其作用是结束本次循环,即不再执行循环体中continue语句之后的语句,而是立即转入对循环条件的判断和执行。 continue语句和break语句的区别:continue语句只能结束本次循环,而不是终止整个循环的执行;而break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。下面给出了continue语句用于各种循环结构的情况及执行流程, 注 break语句与continue语句的区别: (1)break语句终止当前循环,执行循环体外的第一条语句;而continue语句是终止本次循环,继续执行下一次循环。 (2)break语句可以用于switch语句,而continue语句不可以。
exit函数
除了goto、break、continue流程控制语句外,C语言中的标准库函数也可以用于控制程序的流程。为了在程序中调用该函数,需要在程序开头包含头文件<stdlib.h>。exit函数的一般调用格式如下: exit(int state); exit函数的作用是终止程序的执行,强制返回操作系统,并将int型参数state的值传送给调用进程(一般为操作系统)。当state值为0或宏常量EXIT_SUCCESS时,表示程序正常退出;当state值为非0值或为宏常量EXIT_FAILURE时,表示程序出现某种错误后退出。