当前位置:嗨网首页>书籍在线阅读

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 语句。