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

这意味着,无论循环条件最初是否为真,do-while 循环体内的代码至少会执行一次,这在某些需要先执行操作再进行判断的场景下非常有用。
语法结构
do-while 循环的语法格式如下:
do {
// 循环体
// 这里是需要重复执行的代码块
} while (条件表达式);
语法要点:
do: 关键字,标志着循环的开始。- 花括号,包含了需要重复执行的代码,即循环体,如果循环体只有一条语句,花括号可以省略,但为了代码清晰和避免错误,强烈建议始终使用花括号。
while: 关键字,标志着循环的判断部分。(条件表达式): 这是一个必须的括号,里面是一个表达式(通常是关系表达式或逻辑表达式),这个表达式会被求值。- 如果表达式的结果为非零(真),则程序会跳回
do关键字,重新执行循环体。 - 如果表达式的结果为零(假),则循环结束,程序继续执行
while语句之后的代码。
- 如果表达式的结果为非零(真),则程序会跳回
- 分号 :
while语句的末尾必须有一个分号,这是do-while循环区别于while循环的一个显著特征。
执行流程
我们可以用流程图来理解 do-while 的执行过程:

graph TD
A[开始] --> B[执行 do 后的循环体];
B --> C{判断 while 条件};
C -- 条件为真 --> B;
C -- 条件为假 --> D[循环结束, 执行后续代码];
D --> E[结束];
流程说明:
- 执行循环体:程序首先无条件地进入
do块,执行其中的所有语句。 - 判断条件:执行完循环体后,程序计算
while后面的条件表达式的值。 - 决定下一步:
- 如果条件为真,程序流程返回到步骤 1,再次执行循环体。
- 如果条件为假,
do-while循环终止,程序跳转到循环结构之后的下一条语句继续执行。
一个简单的例子
让我们通过一个经典的例子来感受 do-while 循环:让用户输入一个 1 到 10 之间的数字,如果输入无效,则提示用户重新输入。
#include <stdio.h>
int main() {
int number;
// 使用 do-while 确保至少提示用户一次输入
do {
printf("请输入一个 1 到 10 之间的数字: ");
scanf("%d", &number);
// 检查输入是否有效
if (number < 1 || number > 10) {
printf("输入无效,请重新输入!\n");
}
} while (number < 1 || number > 10); // 如果输入无效,循环继续
printf("恭喜!你输入了一个有效的数字: %d\n", number);
return 0;
}
代码解析:
int number;: 定义一个整型变量number用于存储用户输入。do { ... }: 循环开始。printf(...): 提示用户输入。scanf(...): 读取用户输入并存入number。if (...): 检查输入的数字是否不在 1 到 10 的范围内,如果不在,打印错误信息。
while (number < 1 || number > 10);: 这是循环的判断条件。- 只要用户输入的数字
number小于 1 或者大于 10,这个条件就为真,循环就会继续。 - 只有当用户输入的数字在 1 到 10 之间时,条件才为假,循环才会结束。
- 只要用户输入的数字
printf("恭喜...");: 当循环结束后,说明用户已经输入了有效的数字,打印成功信息。
do-while vs. while vs. for
理解这三种循环的区别至关重要。

| 特性 | do-while 循环 |
while 循环 |
for 循环 |
|---|---|---|---|
| 执行顺序 | 先执行,后判断 | 先判断,后执行 | 先判断,后执行 |
| 循环体执行次数 | 至少执行一次 | 可能一次都不执行 | 可能一次都不执行 |
| 语法结构 | do { ... } while (条件); |
while (条件) { ... } |
for (初始化; 条件; 更新) { ... } |
| 适用场景 | 当循环体必须至少执行一次时,菜单选择、密码输入、需要先读取数据再判断的场景。 | 当循环次数不确定,且循环体可能不需要执行时,等待某个事件发生。 | 当循环次数确定或已知时,或者需要一个明确的计数器时。 |
对比 while 和 do-while:
假设我们想把上面的例子改成 while 循环:
#include <stdio.h>
int main() {
int number;
// 使用 while 循环
while (number < 1 || number > 10) { // 先判断!number 是一个未初始化的垃圾值
printf("请输入一个 1 到 10 之间的数字: ");
scanf("%d", &number);
if (number < 1 || number > 10) {
printf("输入无效,请重新输入!\n");
}
}
printf("恭喜!你输入了一个有效的数字: %d\n", number);
return 0;
}
问题所在:
在 while 循环中,number 在第一次被使用(判断条件)时,它没有被初始化,其值是内存中的随机垃圾值,这个垃圾值可能恰好就在 1 到 10 之间,导致 while 条件为假,循环直接跳过,用户根本没有机会输入,这就是 while 循环可能一次都不执行的原因。
而 do-while 循环完美地解决了这个问题,因为它保证用户至少会被提示一次并输入。
注意事项和最佳实践
-
不要忘记分号 :
while后面的分号是do-while循环语法的一部分,极易被遗忘,忘记它会导致编译错误或逻辑错误。// 错误示例 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 循环就是你的最佳选择,最常见的应用场景包括用户交互(如菜单、输入验证)和需要初始化后才能判断的循环过程。
