do-while 循环是 C 语言中三种基本的循环结构之一(另外两种是 for 循环和 while 循环),它的特点是先执行循环体,然后再判断循环条件,这意味着,无论循环条件初始时是否为真,do-while 循环体内的代码至少会执行一次。

(图片来源网络,侵删)
基本语法
do-while 循环的结构如下:
do {
// 循环体 (Loop Body)
// 这里是需要重复执行的代码
} while (condition);
语法要点:
do: 关键字,表示循环的开始。- 花括号,用于包裹循环体内的所有语句,即使循环体只有一条语句,也强烈建议使用花括号,以增强代码的可读性并避免错误。
while (condition): 关键字while后面跟着一个括号,括号内是一个条件表达式。- 非常重要!
do-while循环的while语句末尾必须有一个分号 ,这是它与while循环在语法上的一个显著区别。
执行流程
do-while 循环的执行流程非常清晰:
- 执行: 首先执行
do和while之间的循环体代码。 - 判断: 执行完循环体后,计算
while后面括号内的condition条件。condition的结果为真(非零),则返回步骤 1,继续执行循环体。condition的结果为假(零),则循环结束,程序继续执行do-while循环后面的代码。
流程图:

(图片来源网络,侵删)
graph TD
A[开始] --> B{执行 do 块内的代码};
B --> C{判断 while (condition) 条件};
C -- 条件为真 --> B;
C -- 条件为假 --> D[结束循环, 执行后续代码];
D --> E[程序结束];
与 while 循环的核心区别
这是理解 do-while 的关键:
| 特性 | while 循环 |
do-while 循环 |
|---|---|---|
| 执行顺序 | 先判断,后执行 | 先执行,后判断 |
| 首次执行 | 如果条件一开始就为假,循环体一次都不会执行。 | 循环体至少会执行一次,无论条件初始值如何。 |
代码示例
示例 1:基本用法(至少执行一次)
这个例子会要求用户输入一个密码,无论用户第一次输入什么,程序都会先显示“密码已接收”,然后再判断是否正确。
#include <stdio.h>
int main() {
int password;
int correct_password = 123456;
printf("请输入密码: ");
// 使用 do-while 循环
do {
// 循环体:先读取用户的输入
scanf("%d", &password);
printf("密码已接收,\n"); // 这行代码无论如何都会执行
// 然后判断密码是否正确
if (password == correct_password) {
printf("密码正确,欢迎进入!\n");
} else {
printf("密码错误,请重试!\n");
}
} while (password != correct_password); // 如果密码不正确,则继续循环
return 0;
}
执行过程分析:
- 程序进入
do块,提示用户输入密码。 - 用户输入
111,scanf读取它。 - 打印 "密码已接收。"。
password(111) 不等于correct_password(123456),if条件不满足,打印 "密码错误,请重试!",注意,do块内的代码已经全部执行完毕。- 接着判断
while条件password != correct_password,这个条件为真(111 != 123456)。 - 因为条件为真,所以返回到
do,开始下一次循环。 - 用户再次输入
123456,scanf读取它。 - 打印 "密码已接收。"。
password(123456) 等于correct_password(123456),if条件满足,打印 "密码正确,欢迎进入!",注意,do块内的代码已经全部执行完毕。- 接着判断
while条件password != correct_password,这个条件为假(123456 != 123456 为假)。 - 因为条件为假,循环结束,程序继续执行
return 0;。
示例 2:使用 break 退出循环
可以在循环体内部使用 break 语句来提前终止 do-while 循环。

(图片来源网络,侵删)
#include <stdio.h>
int main() {
int number = 1;
printf("开始循环:\n");
do {
printf("当前 number 的值是: %d\n", number);
if (number == 5) {
printf("检测到 number 等于 5,使用 break 退出循环,\n");
break; // 当 number 为 5 时,立即跳出整个 do-while 循环
}
number++; // number 自增
} while (number <= 10); // 这个条件实际上不会有机会被判断为假
printf("循环已结束,\n");
return 0;
}
输出:
开始循环:
当前 number 的值是: 1
当前 number 的值是: 2
当前 number 的值是: 3
当前 number 的值是: 4
当前 number 的值是: 5
检测到 number 等于 5,使用 break 退出循环。
循环已结束。
适用场景
do-while 循环适用于那些循环体必须至少执行一次的场景,常见的例子包括:
- 菜单驱动程序: 必须先显示一次菜单,然后根据用户的选择来判断是否再次显示。
- 输入验证: 必须先获取一次用户输入,然后验证其有效性,如果无效则要求重新输入。
- 游戏循环: 游戏至少需要运行一帧才能开始处理游戏逻辑。
最佳实践和注意事项
-
不要忘记分号 : 这是初学者最常犯的错误。
while (condition);末尾的分号绝对不能少。// 错误示例 do { printf("Hello\n"); } while (i < 10) // <-- 缺少分号,会导致编译错误 -
确保循环能终止: 和所有循环一样,必须确保循环条件最终会变为假,否则会导致无限循环。
// 危险示例:这是一个无限循环 int i = 1; do { printf("This will run forever!\n"); // i 没有被修改,i <= 10 永远为真 } while (i <= 10); -
花括号的使用: 即使循环体只有一条语句,也使用花括号。
// 不推荐(虽然语法正确,但容易出错) do printf("Hello\n"); while (i < 10); // 推荐(清晰、安全) do { printf("Hello\n"); } while (i < 10);
do-while 循环是 C 语言中一个非常有用的工具,它的核心特点是“先执行,后判断”,确保了循环体至少执行一次,当你遇到需要先做某件事,然后再根据结果决定是否重复做的场景时,do-while 循环就是最自然、最清晰的选择。
