do while 循环体至少执行一次:先执行后判断,而 while 先判断后执行;do while 末尾需分号,break/continue 行为一致,但 continue 位置不当易致死循环。

do while 循环体至少执行一次
这是最核心的区别:无论条件是否为真,do while 会先执行循环体,再判断条件;而 while 是先判断,为假就直接跳过,一次都不执行。
常见错误是误以为两者只是写法差异,结果在需要「至少处理一次」的场景(比如用户输入校验、初始化后检查)用了 while,导致逻辑跳过关键步骤。
-
while (condition) { /* body */ }→ 先求值condition,为false则整个块被跳过 -
do { /* body */ } while (condition);→ 先执行body,再判断condition,若为true则继续下一轮 - 注意
do while末尾有分号,漏写会导致编译错误:expected ';' before '}' token
while 和 do while 在 break/continue 行为上完全一致
两者对控制流语句的响应没有区别:break 退出整个循环,continue 跳过本轮剩余代码并进入下一轮(对 do while 就是跳到条件判断;对 while 就是跳回条件判断开头)。
不必担心语法结构影响控制流逻辑,真正影响行为的是你把 continue 放在循环体什么位置 —— 特别是在 do while 中,如果 continue 出现在条件计算之前,可能绕过更新逻辑,造成死循环。
立即学习“C++免费学习笔记(深入)”;
- 推荐习惯:把变量更新(如
i++)放在循环体末尾或条件表达式中,避免依赖continue的位置 - 例如:
do { ...; i++; } while (i 比do { if (...) continue; i++; } while (i 更清晰安全
性能差异几乎可以忽略,但语义不可互换
生成的汇编指令数量可能差一条跳转,但在现代编译器(GCC/Clang 优化开启时)下,两者实际运行速度无差别。选哪个不是看快慢,而是看「是否必须先做一次」。
典型不可替换场景:
- 读取用户输入并验证:
do { cin >> x; } while (x 确保至少读一次,否则用while可能永远不进循环 - 从文件/网络首次接收数据包,再根据包头决定是否继续收
- 某些硬件寄存器轮询:必须先触发操作,再查状态位
嵌套和作用域表现相同,但 do while 更容易写错括号
两者都支持嵌套,且每个循环内的变量作用域规则一致(C++17 起,for 初始化语句有独立作用域,但 while 和 do while 都没有这个特性)。
真正容易出问题的是手写 do while 时忘记外层大括号,尤其配合宏定义使用时:
do {
foo();
bar();
} while (cond);如果漏掉 {},只写 do foo(); while (cond);,那 bar() 就不在循环体内了 —— 这种低级错误在调试时极难察觉。
复杂逻辑务必加花括号,哪怕只有一行,也比靠缩进赌运气强。









