Antigloss 最后修改于 2006-12-29
while 循环和 for 循环在每次进入循环体之前都要检查进入循环体的条件是否成立,故而循环体有可能一次都不会被执行。而我们下面所要说的 do while 循环却恰恰相反,它在每次循环体执行完毕后才会检查进入循环体的条件是否成立,这就保证了循环体至少会被执行一次。do while 循环的结构为:
do
一条语句/复合语句(即循环体)
while ( condition );
注意:while ( condition ); 这里的分号(;)可千万不能省!
do while 循环的执行过程如下图所示:

第一次进入循环体时,不用先检查 condition 是否成立,而是马上进入循环体,等循环体执行完毕后才检查 condition 是否为真,如果为真,则再次执行循环体,反之,则退出循环,转而执行后续的语句。其中,condition 可以是任何合法的表达式。例如:
#include <stdio.h>
#include <string.h>
#define NAME "Antigloss"
int main(void)
{
char name[20];
do
{
printf("Please guess what's my name: ");
scanf("%19s", name);
} while ( strcmp(NAME, name) );
printf("Yeah! You got it!\n");
return 0;
}
上例中,第一次进入循环体时,不需检查 strcmp(NAME, name) 是否为真(strcmp 函数用于判断两个字符串是否相等,如果相等,则返回 0),而是立刻无条件执行循环体:先输出 Please guess what's my name: ,然后等待用户输入(scanf 函数中的 "%19s" 命令 scanf 最多把用户输入中的 19 个字符放入数组 name);循环体执行完后才检测 strcmp(NAME, name) 是否为真:如果 NAME 不等于 name,则 strcmp 返回非 0(真),再次执行循环体,如果 NAME 等于 name,则 strcmp 返回 0(假),退出循环,转而执行后续的语句,即 printf("Yeah! You got it!\n"); 。由于使用了 do while 循环,本例中的循环体至少会被执行一次。
当格式限定符为 %s 时,scanf 在把用户输入读入数组后,会自动在数组中最后一个被读入的字符后面添上 \0,又因为我们把 name 定义成只有 20 个元素的数组,所以我们需要使用 %19s(可以小于 19,但绝不能大于 19)控制 scanf 如何接收用户输入,防止对尚未分配的空间进行读写。这样,就算用户输入了 300 个字符,scanf 也只会把前面的 19 个字符读入数组,然后添上 \0。使用 strcmp 函数需要先包含标准头文件 string.h。
与上例等价的 while 循环如下:
#include <stdio.h>
#include <string.h>
#define NAME "Antigloss"
int main(void)
{
char name[20];
printf("Please guess what's my name: ");
scanf("%19s", name);
while ( strcmp(NAME, name) )
{
printf("Please guess what's my name: ");
scanf("%19s", name);
}
printf("Yeah! You got it!\n");
return 0;
}
由于使用的是 while 循环,本例中的循环体有可能一次都不会被执行。
参考资料:C Primer 5th Edition
The C Programming Language 2nd Edition
C99 标准
本文版权归 蚂蚁的 C/C++ 标准编程 以及 作者 antigloss 共同所有,转载请注明原作者和出处。谢谢。