6.2 while语句
while循环的通用形式如下:
while( expression )
statement
statement部分是以分号结尾的简单语句,也可以是用花括号括起来的复合语句。
expression可以使用任何表达式。如果expression为真(或者更一般地说,非零),执行statement部分一次,然后再次判断expression。在expression为假(0)之前,循环的判断和执行一直重复执行。每次循环都被称为一次迭代(iterator)。
6.2.1 终止while循环
while循环有一点非常重要:在构建while循环时,必须让测试表达式的值有所变化,表达式最终要为假。否则,循环就不会终止(实际上可以用break和if语句来终止循环)。
最小负值减1一般会得到最大值,最大值加1一般会得到最小值。
6.2.2 何时终止循环
要明确一点:只有在对测试条件求值时,才决定是终止还是继续循环。
// when.c -- when a loop quits
#include
int main(void)
{
int n = 5;
while (n < 7) // line 7
{
printf("n = %d\n", n);
n++; // line 10
printf("Now n = %d\n", n); // line 11
}
printf("The loop has finished.\n");
return 0;
}
/* 输出:
*/
6.2.3 while:入口条件循环
所谓“有条件”指的是语句部分的执行取决于测试表达式描述的条件。该表达式是一个入口条件(entry condition),因为必须满足条件才能进入循环体。
6.2.4 语法要点
使用while时,要牢记一点:只有在测试条件后面的单独语句(简单语句或复合语句)才是循环部分。
缩进是为了让读者阅读方便,不是计算机的要求。
/* while1.c -- watch your braces */
/* bad coding creates an infinite loop */
#include
int main(void)
{
int n = 0;
while (n < 3)
printf("n is %d\n", n);
n++;
printf("That's all this program does\n");
return 0;
}
这是一个无限循环(infinite loop),除非强行关闭程序,不然没有外部干涉就不会退出。
记住,即使while语句本身使用复合语句,在语句构成上,它也是一条单独的语句。该语句从while开始执行,到第1个分号结束。在使用了复合语句的情况下,到右花括号结束。
要注意放置分号的位置。
/* while2.c -- watch your semicolons */
#include
int main(void)
{
int n = 0;
while (n++ < 3); /* line 7 */
printf("n is %d\n", n); /* line 8 */
printf("That's all this program does.\n");
return 0;
}
/* 输出:
*/
测试条件后面的单独分号是空语句(null statement),它什么也不做。在C语言中,单独的分号表示空语句。有时,程序员会故意使用带空语句的while语句,因为所有的任务都在测试条件中完成了,不需要在循环体中做什么。
while( scanf( "%d", &num ) == 1 )
;/*跳过整数输入*/
注意,为了提高代码的可读性,应该让这个分号单独占一行,不要直接把它放在测试表达式同行。这样做一方面让读者更容易看到空语句,一方面也提醒自己和读者空语句是有意而为之。处理这种情况更好的方法是使用下一章介绍的continue语句。