do while循环先执行后判断,适用于至少执行一次的场景;基本结构为do {语句块} while (condition);,末尾分号不可省略,condition在每次循环体结束后求值。

do while 循环的基本写法和语法要点
必须先执行一次循环体,再判断条件,所以 do while 适合「至少跑一遍」的场景,比如用户输入校验、菜单选择。
基本结构是:do { /* 语句块 */ } while (condition);,注意末尾的分号不能漏——这是最容易出错的地方,漏掉会编译报错 expected ';' before 'while'。
-
condition是布尔表达式,每次循环结束时才求值 - 循环体可以是单条语句,但更常见的是用花括号包裹多条语句
- 如果循环体内有
break或continue,行为和while一致,但continue会直接跳到while后的条件判断
什么时候该用 do while 而不是 while 或 for
核心区别在于执行时机:只有你明确需要「先做、后判」时才选 do while。比如读取用户输入并验证格式,不能跳过第一次输入。
对比来看:while (cin >> x && x > 0) 可能一次都不执行;而 do { cin >> x; } while (x 至少读一次,再决定是否重试。
- 菜单驱动程序(显示选项 → 获取输入 → 判断是否退出)
- 初始化后需立即检查状态的硬件轮询逻辑
- 避免把相同代码写两遍(比如先读再进 while)的重复劳动
容易踩的坑:分号、作用域和无限循环
除了结尾分号,另一个高频问题是把变量声明放在 do 块内,又在 while 条件里引用它——这会编译失败,因为 while 不在 do 的作用域内。
例如下面这段是错的:
do {
int x;
cin >> x;
} while (x > 0); // error: 'x' was not declared in this scope
正确做法是把 x 提前声明在 do 外:
int x;
do {
cin >> x;
} while (x > 0);
- 条件表达式里别写有副作用的操作(如
while (i++ ),容易和 <code>for混淆逻辑节奏 - 没有更新条件变量,或更新逻辑写在循环体外,会导致死循环
- 在嵌套循环中用
break只跳出最内层,别指望它终止do while外的其他结构
和 while 循环的性能与可读性差异
生成的汇编指令几乎没差别,现代编译器对两者优化程度一致,不用为性能选型。
真正影响决策的是语义清晰度:当你看到 do { ... } while (cond);,就该立刻意识到「这事至少干一回」;而 while (cond) { ... } 暗示可能零次执行。
- 团队协作时,错误地把
do while改成while可能引入空输入未处理的 bug - 某些静态分析工具(如 clang-tidy)会对无条件
do { ... } while(0)宏写法发出警告,但这属于另一类用途,和流程控制无关
边界情况比想象中多,尤其是涉及 I/O 或状态变更时,多想一步「第一次执行是否合理」,比事后调试省事得多。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











