do-while 循环是 C 语言中三种基本循环结构(for、while、do-while)之一,它的核心特点是 “先执行,后判断”,这意味着循环体内的代码至少会执行一次。

(图片来源网络,侵删)
语法结构
do-while 循环的语法格式如下:
do {
// 循环体
// 这里是需要重复执行的代码
} while (表达式);
语法要点:
do: 这是循环的起始关键字。- 花括号用于包裹循环体内的所有语句,即使循环体只有一条语句,也强烈建议使用花括号,以增加代码的可读性和避免错误。
while (表达式): 这是循环的判断部分。- 表达式通常是一个关系表达式或逻辑表达式(
i < 10)。 - 关键点:在
do-while循环中,这个判断是在 循环体执行完毕之后 才进行的。 - 如果表达式的结果为 真(非零),则程序会跳回
do关键字处,再次执行循环体。 - 如果表达式的结果为 假(零),则循环结束,程序继续执行
while语句后面的代码。
- 表达式通常是一个关系表达式或逻辑表达式(
- 分号 :
while (表达式)后面的分号 绝对不能忘记!这是do-while循环区别于while循环的一个显著语法特征。
执行流程
我们可以通过一个流程图来理解它的执行逻辑:
graph TD
A[开始] --> B[执行 do 后面的循环体];
B --> C{判断 while(表达式) 的结果};
C -- 为真 (非0) --> B;
C -- 为假 (0) --> D[循环结束, 执行后续代码];
D --> E[结束];
流程总结:

(图片来源网络,侵删)
- 执行:无条件执行一次
do { ... }中的循环体。 - 判断:计算
while (表达式)的值。 - 循环:如果值为真,返回步骤 1,继续执行循环体。
- 退出:如果值为假,循环终止,程序执行
while语句后面的下一条语句。
与 while 循环的关键区别
这是理解 do-while 循环最核心的部分。
| 特性 | while 循环 |
do-while 循环 |
|---|---|---|
| 执行顺序 | 先判断,后执行 | 先执行,后判断 |
| 首次执行 | 如果第一次判断条件为假,循环体一次都不会执行。 | 循环体至少会执行一次,无论条件初始值是什么。 |
| 语法结尾 | while (expression) 没有分号 |
while (expression); 必须有分号 |
简单记忆:
while:像一个严格的门卫,进门前要先检查你的票(条件),没票就不让你进。do-while:像一个热情的店家,先进来尝一口(执行一次),吃完后你再决定要不要付钱(判断条件)。
示例代码
示例 1:基本的 do-while 循环
这个例子会打印从 1 到 5 的数字。
#include <stdio.h>
int main() {
int i = 1;
printf("do-while 循环开始:\n");
do {
printf("i = %d\n", i);
i++; // i 自增
} while (i <= 5);
printf("do-while 循环结束,\n");
return 0;
}
输出:

(图片来源网络,侵删)
do-while 循环开始:
i = 1
i = 2
i = 3
i = 4
i = 5
do-while 循环结束。
分析:
i初始为 1。- 第一次循环:直接进入
do块,打印i = 1,i变为 2,接着判断while (i <= 5),即2 <= 5,为真,继续循环。 - 后续循环:重复执行,打印 2, 3, 4, 5,每次
i都会自增。 - 当 i = 6 时:打印完
i = 5后,i变为 6,判断while (6 <= 5),为假,循环结束。
示例 2:至少执行一次的场景
这个例子展示了 do-while 循环的“至少执行一次”的特性,我们要求用户输入一个密码,只要不正确就要求重新输入。
#include <stdio.h>
int main() {
int password;
do {
printf("请输入密码 (提示: 1234): ");
scanf("%d", &password);
} while (password != 1234);
printf("密码正确!欢迎进入系统,\n");
return 0;
}
运行过程模拟:
- 用户第一次输入
1111:- 程序直接进入
do块,提示输入密码。 - 用户输入
1111。 - 判断
while (1111 != 1234),为真,循环继续。
- 程序直接进入
- 用户第二次输入
5678:- 再次进入
do块,提示输入密码。 - 用户输入
5678。 - 判断
while (5678 != 1234),为真,循环继续。
- 再次进入
- 用户第三次输入
1234:- 再次进入
do块,提示输入密码。 - 用户输入
1234。 - 判断
while (1234 != 1234),为假,循环结束。 - 程序执行下一条语句,打印 "密码正确!..."。
- 再次进入
关键点:即使你第一次就输入了正确的密码,do 块里的 printf 和 scanf 也必须先执行一次,然后才会去判断密码是否正确,这是 do-while 在这个场景下的必然行为。
适用场景
do-while 循环非常适合以下情况:
-
菜单驱动程序:显示一个菜单,然后等待用户选择,无论用户是否第一次就按了退出键,菜单都必须至少显示一次。
do { printf("\n===== 主菜单 =====\n"); printf("1. 查看信息\n"); printf("2. 修改设置\n"); printf("3. 退出\n"); printf("请输入您的选择: "); scanf("%d", &choice); } while (choice != 3); -
输入验证:确保用户输入了有效数据,要求用户输入一个正数,如果输入了负数或零,则要求重新输入。
int number; do { printf("请输入一个正数: "); scanf("%d", &number); if (number <= 0) { printf("输入无效,请重新输入!\n"); } } while (number <= 0); printf("您输入的有效数字是: %d\n", number); -
需要至少执行一次的任务:任何“先做一次,然后根据结果决定是否继续”的场景。
| 特性 | 描述 |
|---|---|
| 核心思想 | 先执行,后判断。 |
| 最少执行次数 | 1 次。 |
| 语法结构 | do { ... } while (expression); |
与 while 的区别 |
while 可能一次都不执行,do-while 至少执行一次。do-while 的 while 后面有分号。 |
| 优点 | 适用于需要保证循环体至少执行一次的场景,代码逻辑清晰。 |
| 缺点 | 如果不小心,可能会导致无限循环,因为条件判断在最后。 |
掌握 do-while 循环,并理解它与 while 循环的根本区别,是编写健壮、高效 C 语言程序的重要一环。
