do-while 循环是 C 语言中三种基本的循环结构之一(另外两种是 for 循环和 while 循环),它的特点是 “先执行,后判断”,也就是说,循环体内的代码至少会被执行一次。

(图片来源网络,侵删)
语法结构
do-while 循环的语法格式如下:
do {
// 循环体(需要重复执行的代码)
} while (表达式);
语法要点:
do:是循环的起始关键字。- 花括号内是循环体,包含一条或多条需要重复执行的语句,如果循环体只有一条语句,可以省略花括号,但为了代码清晰和避免错误,强烈建议始终使用花括号。
while (表达式):这是循环的判断部分。- 表达式通常是一个关系表达式或逻辑表达式(
i < 10)。 - 这个表达式在循环体执行完毕后才会被计算。
- 如果表达式的结果为 真(非零),则循环继续,程序会跳回
do关键字处,再次执行循环体。 - 如果表达式的结果为 假(零),则循环终止,程序继续执行
while语句后面的代码。
- 表达式通常是一个关系表达式或逻辑表达式(
- 分号 :
while (表达式)后面必须有一个分号,这是do-while循环区别于while循环的一个关键语法特征,很多初学者会忘记这个分号,导致编译错误。
执行流程
do-while 循环的执行流程可以用以下步骤来描述:
- 执行:执行
do和 之间的循环体代码。 - 判断:执行完循环体后,计算
while后面的表达式的值。 - 决策:
- 如果表达式为 真,程序流程跳转回第 1 步,继续执行循环体。
- 如果表达式为 假,循环结束,程序流程跳转到
do-while循环结构之后的下一条语句继续执行。
流程图:

(图片来源网络,侵删)
graph TD
A[开始] --> B{执行 do 循环体};
B --> C{计算 while(表达式)};
C -- 表达式为真 --> B;
C -- 表达式为假 --> D[结束循环, 执行后续代码];
D --> E[程序结束];
与 while 循环的关键区别
这是理解 do-while 的核心:
| 特性 | while 循环 |
do-while 循环 |
|---|---|---|
| 执行顺序 | 先判断,后执行 | 先执行,后判断 |
| 首次执行 | 如果第一次判断条件就为假,循环体一次都不会执行。 | 循环体至少会执行一次,无论条件初始值是什么。 |
| 语法 | while (表达式) { ... } |
do { ... } while (表达式); |
简单总结:
- 用
while循环,当你不确定是否需要进入循环时(读取用户输入,如果输入无效则不处理)。 - 用
do-while循环,当你知道循环体至少需要执行一次时(显示一个菜单,并等待用户选择,无论用户第一次怎么选,菜单至少要显示一次)。
代码示例
示例1:经典的 do-while 用法(用户输入验证)
这个场景最能体现 do-while 的优势:确保代码至少执行一次。
#include <stdio.h>
int main() {
int choice;
// 这个循环会一直显示菜单,直到用户输入 1, 2, 或 3
do {
printf("\n请选择一个操作:\n");
printf("1. 新游戏\n");
printf("2. 加载存档\n");
printf("3. 退出\n");
printf("请输入你的选择 (1-3): ");
scanf("%d", &choice);
// 如果输入无效,给出提示
if (choice < 1 || choice > 3) {
printf("无效的输入,请重新选择!\n");
}
} while (choice < 1 || choice > 3); // 只有当输入有效时,循环才会结束
printf("你选择了 %d,\n", choice);
return 0;
}
分析:
无论用户第一次输入的是 0、5 还是 abc,菜单和提示信息都会先显示一次,程序才会判断输入是否有效,如果无效,循环继续,再次显示菜单,这确保了用户总能看到菜单。
示例2:简单的计数器
#include <stdio.h>
int main() {
int i = 1;
int sum = 0;
// 计算 1 到 5 的和
do {
sum += i; // sum = sum + i;
i++;
printf("i = %d, sum = %d\n", i, sum);
} while (i <= 5);
printf("\n最终的和是: %d\n", sum);
return 0;
}
输出:
i = 2, sum = 1
i = 3, sum = 3
i = 4, sum = 6
i = 5, sum = 10
i = 6, sum = 15
最终的和是: 15
分析:
i初始为 1。- 进入
do块,sum变为 1,i变为 2。 - 判断
while (i <= 5),2 <= 5为真,继续循环。 sum变为 3,i变为 3。- ...以此类推,直到
i变为 6。 - 判断
while (6 <= 5)为假,循环结束。
注意事项
-
不要忘记分号 :
while (expression);末尾的分号是必须的。// 正确 do { // code } while (i > 0); // 错误!编译器会报错 do { // code } while (i > 0) // 缺少分号 -
避免无限循环:确保循环条件在某个时刻会变为假,否则会导致无限循环。
// 危险!这是一个无限循环 int i = 1; do { printf("This will run forever!\n"); // i 没有增加,i <= 10 永远为真 } while (i <= 10); -
使用括号:即使循环体只有一条语句,也使用花括号 ,这能提高代码的可读性,并防止在后续添加代码时出现逻辑错误。
do-while 循环是 C 语言中一个非常有用的工具,当你需要一段代码保证至少执行一次,然后在满足特定条件时继续重复执行时,do-while 就是最佳选择,它与 while 循环的核心区别在于执行顺序,理解这一点就能在合适的场景下正确地使用它。
