09-语法要点
6.2.4 语法要点
使用 while
时,要牢记一点:只有在测试条件后面的单独语句(简单语句或复合语句)才是循环部分。程序清单6.3演示了忽略这点的后果。缩进是为了让读者阅读方便,不是计算机的要求。
程序清单6.3 while1.c
程序
/* while1.c -- 注意花括号的使用 */
/* 糟糕的代码创建了一个无限循环 */
#include <stdio.h>
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;
}
该程序的输出如下:
n is 0
n is 0
n is 0
n is 0
n is 0
...
屏幕上会一直输出以上内容,除非强行关闭这个程序。
虽然程序中缩进了 n++;
这条语句,但是并未把它和上一条语句括在花括号内。因此,只有直接跟在测试条件后面的一条语句是循环的一部分。变量 n
的值不会改变,条件 n < 3
一直为真。该循环会一直打印 n is 0
,除非强行关闭程序。这是一个无限循环(infinite loop)的例子,没有外部干涉就不会退出。
记住,即使 while
语句本身使用复合语句,在语句构成上,它也是一条单独的语句。该语句从 while
开始执行,到第1个分号结束。在使用了复合语句的情况下,到右花括号结束。
要注意放置分号的位置。例如,考虑程序清单6.4。
程序清单6.4 while2.c
程序
/* while2.c -- 注意分号的位置 */
#include <stdio.h>
int main(void)
{
int n = 0;
while (n++ < 3); /* 第7行 */
printf("n is %d\n", n); /* 第8行 */
printf("That's all this program does.\n");
return 0;
}
该程序的输出如下:
n is 4
That's all this program does.
如前所述,循环在执行完测试条件后面的第1条语句(简单语句或复合语句)后进入下一轮迭代,直到测试条件为假才会结束。该程序中第7行的测试条件后面直接跟着一个分号,循环在此进入下一轮迭代,因为单独一个分号被视为一条语句。虽然 n
的值在每次循环时都递增 1
,但是第8行的语句不是循环的一部分,因此只会打印一次循环结束后的 n
值。
在该例中,测试条件后面的单独分号是空语句(null statement),它什么也不做。在C语言中,单独的分号表示空语句。有时,程序员会故意使用带空语句的 while
语句,因为所有的任务都在测试条件中完成了,不需要在循环体中做什么。例如,假设你想跳过输入到达第1个既不是空白字符也不是数字的位置,可以这样写:
while (scanf("%d", &num) == 1)
; /* 跳过整数输入 */
只要 scanf()
读取一个整数,就会返回1,循环继续执行。注意,为了提高代码的可读性,应该让这个分号独占一行,不要直接把它放在测试表达式同行。这样做一方面让读者更容易看到空语句,一方面也提醒自己和读者空语句是有意而为之。处理这种情况更好的方法是使用下一章介绍的 continue
语句。