do-while循环先执行循环体后判断条件,因此至少执行一次;while循环先判断条件后执行循环体,可能一次都不执行。

do while 的执行顺序决定了它必然至少运行一次
因为 do while 把条件判断放在循环体**之后**,编译器会先无条件执行一遍循环体,再检查 while 后的表达式。这和 while(先判后做)或 for(先判后做)有本质区别。
对比 while 和 do while 的汇编/执行流差异
哪怕条件一开始就是 false,do while 也不会跳过第一次执行:
int i = 0;
do {
printf("run\n"); // 这行一定会打印一次
} while (i > 10); // 条件为 false,但已执行完循环体
而等价的 while 写法:
int i = 0;
while (i > 10) {
printf("run\n"); // 这行完全不会执行
}
关键点在于:控制流在 do while 中是「进循环 → 执行 → 判条件 → 决定是否跳回开头」;while 是「判条件 → 为真才进循环 → 执行 → 跳回判条件」。
什么时候必须用 do while?常见真实场景
适合需要「至少尝试一次 + 后续依赖结果继续」的逻辑,比如用户输入校验、资源初始化重试、状态轮询:
- 读取用户输入并验证格式,不能跳过首次输入
- 打开文件失败时重试,但必须至少调用一次
fopen - 硬件寄存器轮询就绪位,上电后需先读一次再判断
错误用法示例:do { x = rand(); } while (x != 42); —— 看似简洁,但若业务逻辑要求「初始值必须有效」,这种写法反而掩盖了初始化意图;更清晰的做法是先赋初值再进入 while 循环。
容易被忽略的分号和空语句陷阱
do while 的语法结尾必须带分号,且 while 后面的括号**不能跟花括号**(否则变成空循环体):
do {
foo();
} while (cond); // ✅ 正确
do {
foo();
} while (cond) {} // ❌ 错误:{} 是独立空语句,循环体只执行 foo() 一次
do foo(); while (cond); // ✅ 合法,但可读性差,不推荐
另一个坑:宏定义中滥用 do while(0) 是为了包裹多语句,此时它已脱离循环语义,纯粹是语法技巧——别把它和逻辑循环混淆。
真正理解 do while 的“至少一次”,不是靠死记,而是看它在控制流图里那个无法绕过的入口节点。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











