for循环先判断后执行,流程为init→test→body→update;while同为入口判断、可能零次;do-while先执行后判断、至少一次。选择依据是判断时机和最小执行次数。

for 循环的执行顺序:三段式控制,入口判断
for 循环是「先判断、后执行」的入口条件循环,整个流程严格按四步走:init-expression → test-expression(为 true 才进)→ body → update-expression → 回到 test-expression。
关键点在于:test-expression 在每次迭代**开始前**求值;update-expression 在每次 body 执行完**之后**才运行;init-expression 只执行一次,且在第一次判断前完成。
常见错误现象:
- 把更新逻辑写在
body里又忘了写update-expression,导致死循环 - 误以为
update-expression在body前执行,结果首次迭代就用了未更新的值 - 省略
test-expression(如写成for(;;))却不加break,直接无限循环
while 循环的执行顺序:纯入口判断,可能零次执行
while 和 for 的判断时机一致:每次循环开始前检查条件表达式。区别在于它没有内置初始化和更新机制,所有变量管理都靠手动。
立即学习“C++免费学习笔记(深入)”;
执行流程就是一句话:test-expression → 若为 true,执行 body → 再回到 test-expression。
使用场景:
- 循环次数完全未知,只依赖某个状态变化(比如读取文件直到 EOF)
- 需要复用已有变量,不希望被 for 的作用域包裹(
int i在 for 外仍可访问)
容易踩的坑:
- 忘记在
body中修改判断所用的变量,条件永远为真 - 把分号错写在
while(...);后面,导致空循环体,body变成单次执行的普通语句
do-while 循环的执行顺序:先跑再判,至少一次
do-while 是唯一一个「先执行、后判断」的循环,结构上必须带结尾分号:do { ... } while (condition);。分号漏掉会编译报错,不是可选项。
执行顺序固定为:body → condition → 若为 true,跳回 body;否则退出。
典型用途:
- 用户输入验证(先显示菜单/提示,再检查输入是否合法)
- 需要确保某段逻辑至少触发一次的初始化场景
注意点:
-
condition是 while 后圆括号里的表达式,不是 if 那种语法,别写成do { ... } while (condition) { ... } - 循环体内的变量若在
condition中被引用,必须在do块之前声明(C++ 不允许在do块内声明后直接用于while判断)
三种循环怎么选:看「何时判断」和「是否保底执行」
核心差异其实就两个维度:判断时机(入口 vs 出口)和 最小执行次数(0 次 vs 1 次)。
对照表更直观:
| 循环类型 | 判断位置 | 最小执行次数 | 是否适合已知次数 | 典型错误信号 | |----------|-----------|----------------|-------------------|----------------| | for | 每次迭代前 | 0 | ✅(推荐) | <code>i</code> 未在 <code>update-expression</code> 中更新 | | while | 每次迭代前 | 0 | ⚠️(需手动管变量) | <code>body</code> 里没改判断变量 | | do-while | 每次迭代后 | 1 | ❌(不自然) | 忘写结尾分号,或 <code>condition</code> 引用未声明变量 |
真正容易被忽略的是:for 的 update-expression 并非强制更新索引——它可以是任意表达式,比如 ++i, ++j, printf(".");。但一旦混用多个副作用,可读性和调试难度会陡增。别为了省一行代码牺牲确定性。


















