do-while循环至少执行一次,先执行后判断,适用于必须尝试至少一次的场景,如用户输入校验、读取文件头、硬件轮询等,结尾分号不可省略,条件表达式需为布尔型且避免赋值错误。

do-while 循环一定会执行一次,哪怕条件一开始就不成立
这是它和 while 最本质的区别:先干活,再判断。适合那些「至少要试一次」的场景,比如用户输入校验、初始化后重试、读取文件头信息等。
常见错误是把它当 while 用,结果发现多跑了一次逻辑——比如本想输入正数才继续,却在输负数时仍执行了后续处理。
-
do { ... } while (condition);结尾必须有分号,漏掉会编译报错:expected ';' before '}' token -
condition是布尔表达式,写成while (x = 5)这种赋值会导致无限循环(且编译器通常会警告) - 循环体里修改条件变量的语句不能漏,否则容易变成死循环;尤其注意作用域——如果在
do块内定义变量,while判断时访问不到
什么时候该用 do-while,而不是 while 或 for
看控制流意图:你是否需要「先做,再决定要不要再做」?不是语法偏好,而是语义匹配。
典型使用场景包括:
立即学习“C++免费学习笔记(深入)”;
- 命令行菜单:显示选项 → 等待输入 → 验证 → 不合法就重来,但第一次菜单必须出现
- 从流中读取首块数据(如
cin >> x),再检查是否成功,失败则退出,否则继续 - 硬件轮询:发指令 → 等待状态寄存器就绪 → 若未就绪则延迟后重试
用 while 模拟等效逻辑,得额外写一遍初始化代码,容易遗漏或重复;for 更不适合——它天生是「先判后进」结构。
do-while 和 break、continue 的配合要小心
break 能跳出整个循环,没问题;但 continue 在 do-while 中的行为常被误解:它直接跳到 while 条件判断,不执行循环体末尾之后的代码,也不“重新开始”循环体开头。
也就是说,continue 在 do-while 中等价于「提前结束本轮,立刻判断条件」,不是「回到 do 开头」。
- 如果循环体里有多个分支,某个分支用了
continue,要确认条件变量是否已被更新,否则可能跳过关键修改导致逻辑错乱 - 嵌套循环中,
continue只影响最内层的do-while,这点和while/for一致 - 混用
goto和do-while极易失控,不推荐;C++17 后更建议用带标签的break替代
编译器对 do-while 的优化基本没差别,但可读性差就真难调试
现代编译器(GCC/Clang/MSVC)对 do-while(0) 这类技巧做宏包装时会完全内联,性能无损耗。但普通业务代码里硬套 do-while 反而增加理解成本。
真正容易被忽略的是:当循环体很长、条件判断又藏在几十行后面时,人眼很难一眼看出「这次到底会不会再进」。调试时断点打在 while 行,容易误以为它控制的是上一轮,其实它决定的是下一轮。
所以,除非语义明确要求「至少一次」,否则优先选 while;如果逻辑复杂,拆成函数 + 显式 return 比靠循环结构硬绕更可靠。










