什么是 do-while 循环?
do-while 循环是 C 语言中三种基本的循环结构之一(另外两种是 for 循环和 while 循环),它的核心特点是:先执行循环体中的代码,然后再判断循环条件。

(图片来源网络,侵删)
这意味着,无论循环条件最初是否成立,do-while 循环体内的代码至少会执行一次,这是它与 while 循环最关键的区别。
语法结构
do-while 循环的语法格式如下:
do {
// 循环体
// 这里是需要重复执行的代码
} while (表达式);
语法要点:
do:是循环的起始关键字。- 花括号内是循环体,包含需要重复执行的语句,如果循环体只有一条语句,可以省略花括号,但为了代码清晰和避免错误,强烈建议始终使用花括号。
while:是循环的结束关键字,用于判断是否继续循环。(表达式):这是一个条件表达式,它会进行求值。- 如果表达式的值为非零(真,true),则循环继续,程序会跳回
do关键字,再次执行循环体。 - 如果表达式的值为零(假,false),则循环结束,程序继续执行
while循环之后的下一条语句。
- 如果表达式的值为非零(真,true),则循环继续,程序会跳回
- 分号 :
while (表达式)的末尾必须有一个分号,这是初学者最容易忘记的地方,会导致编译错误。
执行流程
do-while 循环的执行流程可以用以下步骤来描述:

(图片来源网络,侵删)
- 执行:执行
do和while之间的循环体代码。 - 判断:执行完循环体后,计算
while后面括号内的表达式的值。 - 分支:
- 如果表达式为真(非零),则跳回第 1 步,继续执行循环体。
- 如果表达式为假(零),则
do-while循环结束,程序继续执行循环结构后面的代码。
我们可以用一个流程图来表示:
示例代码
示例 1:基本的数字打印
这个例子会打印数字 1 到 5。
#include <stdio.h>
int main() {
int i = 1;
printf("do-while 循环开始:\n");
do {
printf("%d ", i); // 打印当前数字
i++; // i 自增
} while (i <= 5); // 判断 i 是否小于等于 5
printf("\n循环结束,\n");
return 0;
}
输出:
do-while 循环开始:
1 2 3 4 5
循环结束。
代码解析:
i初始化为 1。- 第一次循环:
- 执行
printf("%d ", i);,打印1。 - 执行
i++;,i变为 2。 - 判断
while (i <= 5),即2 <= 5,为真,继续循环。
- 执行
- 第二次到第五次循环:类似地,打印 2, 3, 4, 5,
i依次变为 3, 4, 5, 6。 - 第六次判断:
- 循环体执行完毕,
i的值是 6。 - 判断
while (i <= 5),即6 <= 5,为假。 - 循环结束,程序打印 "循环结束。"。
- 循环体执行完毕,
示例 2:至少执行一次的典型场景
假设你需要让用户输入一个密码,如果密码错误,就提示用户重新输入,无论用户第一次输入什么,程序都必须先“尝试”一次。
#include <stdio.h>
#include <string.h> // 用于 strcmp 函数
#define CORRECT_PASSWORD "123456"
int main() {
char password[20];
// 无论密码对不对,至少会执行一次这个循环体
do {
printf("请输入密码: ");
scanf("%s", password); // 获取用户输入
if (strcmp(password, CORRECT_PASSWORD) == 0) {
printf("密码正确,欢迎进入!\n");
} else {
printf("密码错误,请重试!\n");
}
} while (strcmp(password, CORRECT_PASSWORD) != 0); // 只要密码不正确,就继续循环
return 0;
}
解析:
do块内的代码一定会先执行一次,让用户有机会输入密码。while条件strcmp(password, CORRECT_PASSWORD) != 0表示“只要密码不等于正确密码”。- 如果用户第一次就输对了,
do块执行后,while条件为假(因为!= 0不成立),循环结束。 - 如果用户第一次输错了,
do块执行后,while条件为真,循环继续,再次提示输入。
do-while vs. while vs. for
| 特性 | do-while 循环 |
while 循环 |
for 循环 |
|---|---|---|---|
| 执行顺序 | 先执行,后判断 | 先判断,后执行 | 先判断,后执行 |
| 最少执行次数 | 至少一次 | 可能一次都不执行 | 可能一次都不执行 |
| 适用场景 | 循环体必须至少执行一次的情况,如菜单选择、密码输入。 | 循环次数不确定,且可能一次都不执行的情况,如读取文件直到末尾。 | 循环次数确定或有明确初始化、条件、迭代步骤的情况。 |
| 语法 | do { ... } while (expr); |
while (expr) { ... } |
for (init; expr; step) { ... } |
while 循环示例对比:
如果把上面的密码输入例子改成 while 循环:
// 错误的用法示例
while (strcmp(password, CORRECT_PASSWORD) != 0) { // 先判断!
printf("请输入密码: ");
scanf("%s", password);
// ...
}
如果用户第一次运行程序,password 变量里是未初始化的“垃圾值”,while 条件可能直接为假,导致循环体根本不执行,程序就直接结束了,用户根本没有机会输入密码,这就是 do-while 在此场景下的优势。
注意事项和常见错误
-
忘记末尾的分号 这是最常见的语法错误。
// 错误示范 do { printf("Hello\n"); } while (i < 10) // 这里缺少分号!编译器会报错,提示在
while附近有语法错误。 -
循环条件永远为真(无限循环) 如果循环条件是一个永远为真的表达式,循环将永远不会结束,导致程序“卡死”。
int i = 1; do { printf("This will run forever!\n"); // 忘记了 i++,导致 i 的值永远是 1 // while (i <= 5) 永远为真 } while (i <= 5); -
变量初始化 确保在循环开始前,循环条件中使用的变量已经被正确初始化。
int count; // 未初始化 do { printf("Count: %d\n", count); count++; } while (count < 5); // count 的初始值是未知的,可能导致意外行为
do-while 循环是 C 语言中一个非常有用的工具,当你需要一段代码无论如何都必须至少执行一次时,它就是最佳选择。
核心要点回顾:
- 语法:
do { ... } while (expr); - 特点:先执行,后判断,保证循环体至少执行一次。
- 应用场景:菜单系统、密码验证、游戏中的“至少玩一关”等。
- 关键:不要忘记
while后面的分号。
熟练掌握 do-while 循环,能让你的代码逻辑更加清晰和健壮。
