预计阅读本页时间:-
以下为while循环的一般形式:
while(expression)
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元
statement
statement部分可以是一个带有分号的简单语句,也可以是花括号中的一个复合语句。
迄今为止的例子使用关系表达式作为循环的expression部分,也就是说,例子中的expression是一个值的对比关系。更一般地,您可以使用任何表达式。如果expression为真(或者更一般地说,非零),那么就执行一次statement部分,然后再次判断expression。在expression变为假(零)之前要重复这个判断和执行的循环。每次循环都被称为一次迭代(请参见图6.1)。
图6.1 while循环的结构
6.2.1 终止while循环
这是对while循环至关重要的一点:当您构造一个while循环时,循环中必须包含能改变判断表达式的值来使表达式的值最终变为假。否则循环永远不会终止(实际上,您也可以使用break和if语句来终止循环,这将在后续的章节中介绍)。考虑以下的例子:
index=1;
while(index<5)
printf(“Good morning!\n”);
上面的代码段无限期地打印这个令人愉快的消息。为什么?因为在循环中不能改变index的值,这样它就一直为1。现在看一下这个:
index=1;
while(--index< 5)
printf(“Good morning!\n”);
后面的代码段也好不到那里去,它改变了index的值,但是却是朝着错误的方向。至少这个版本最后还可以终止,那要等index减小到比系统可以处理的最小的负数还小并变成最大的可能的正数的时候了(第3章“数据和C”中的toobig.c程序说明了最大的正数一般如何加1就变成一个负数,同样,最小的负数如何减1就能产生一个正数)。
6.2.2 循环何时终止
要知道只有在计算判断条件的值时才决定是终止循环还是继续执行,这一点很重要。例如,考虑程序清单6.2中的程序。
程序清单6.2 when.c程序
运行程序清单6.2会产生下列输出:
n = 5
Now n = 6
n = 6
Now n = 7
The loop has finished.
在第二次循环中,变量n在第10行首次获得值7。然而程序此时并不退出。相反,它结束本次循环(第11行),并在对第7行的判断条件第三次求值时才退出循环(变量n在第一次判断时为5,第二次判断时为6)。
6.2.3 while:入口条件循环
while循环是使用入口条件的有条件循环。它被称为有条件是因为语句部分的执行要依赖于判断表达式中的条件,例如(index<5)。这个表达式是一个入口条件是因为在进入循环体之前必须满足这个条件。在下面的情况中,程序永远不会进入循环体,因为条件一开始就为假:
index = 10;
while(index++ < 5)
printf(“Have a fair day or better.\n”);
把第一行改为:
index = 3;
就可以执行这个循环了。
6.2.4 语法要点
在使用while时要谨记的一点是,只有位于判断条件之后的单个语句(简单语句或复合语句)才是循环的部分。缩进是为了帮助读者而不是计算机。程序清单6.3说明了如果您忘记这一点会发生什么。
程序清单6.3 while1.c程序
程序清单6.3产生下列输出:
n is O
n is 0
n is 0
n is 0
n is 0
(……等等,直到您强行关闭这个程序为止)。
尽管这个例子缩进了n++;语句,但是并没有把它和前面的语句放在一个花括号中。这样就只有紧跟在判断条件之后的打印语句构成了循环部分。变量n永远不会得到更新,条件n<3一直保持为真,在您强行关闭这个程序之前它将不断地打印n is 0。这是一个无限循环的例子,没有外部干涉它就不会退出。
要记住while语句本身在语法上算做一个单独的语句,即使它使用了复合语句。该语句从while开始,到第一个分号结束;在使用了复合语句的情况下,到终结花括号结束。
使用分号时也要小心。例如,考虑程序清单6.4中的程序。
程序清单6.4 while2.c程序
程序清单6.4产生下列输出:
n is 4
That's all this program does.
像我们前面所说的那样,循环在判断条件之后的第一个简单或复合语句处就结束了。在第7行的判断条件之后马上就有一个分号,循环将在此处终止,因为一个单独的分号也算做一个语句。第8行的打印语句就不是循环的一部分,所以n在每次循环都增加1,而只在退出循环之后进行打印。
在这个例子中,判断条件后紧跟一个空语句(null statement),它什么都不做。在C中,单独的分号代表空语句。有时候,程序员有意地使用带有空语句的while语句,因为所有的工作都在判断过程中进行。例如,假定您想要跳过输入直到第一个不为空格或数字的字符,您可以使用这样的循环:
while(scanf(“%d”,&num)==1)
; /*跳过整数输入*/
只要scanf()读入一个整数,它就返回1,循环就会继续。请注意,为了清楚起见,应该把分号(空语句)放在下面的一行而不是在同一行中。这使得在阅读程序时更容易看到空语句,也可以提醒您空语句是有意放在那里的。更好的方法是使用在下一章中要讨论的continue语句。