do-while总比while多执行一次,因为它是先执行后判断:即使初始条件为false,do块内代码也已运行;常见错误是误将其当while用,导致本该跳过的逻辑被执行。

do-while 为什么总比 while 多跑一次?
因为它是「后判」:先执行循环体,再检查条件。哪怕 while 后面的表达式一开始就是 false,do 块里的代码也已经跑过了。
常见错误现象:do-while 被当成 while 用,结果本该跳过的逻辑硬生生执行了一次——比如读取用户输入前没校验、写日志时多记一条空记录、数据库插入重复初始化数据。
- 使用场景:需要「至少执行一次」的流程,例如菜单选择、重试机制、初始化+校验组合
- 参数差异:没有「参数」,但条件写在
while(...)里,注意括号必须存在,即使只写while(0) - 性能影响几乎为零,但语义上更明确地表达了「我就是要先干一票」
do-while 的括号和分号不能省
do 块必须用花括号(哪怕只有一行),while 后必须带分号——这是 PHP 语法硬性要求,漏掉就直接报错 Parse error: syntax error, unexpected 'while'。
示例:
立即学习“PHP免费学习笔记(深入)”;
do {
$input = readline('请输入数字:');
} while (!is_numeric($input)); // 注意这行末尾的分号
- 常见错误:把
while后的分号写成逗号、冒号,或干脆忘了 - 容易和
for/foreach混淆,它们后面都不加分号 - IDE 有时不提示这个分号问题,靠运行时报错才发现
break 和 continue 在 do-while 里怎么生效?
break 会立刻跳出整个 do-while;continue 则跳过剩余代码,直接回到 while 条件判断——注意不是跳回 do 开头。
这意味着:continue 后不会「再执行一遍 do 块」,而是先判断条件,条件为真才重新进块。
- 使用场景:在循环体内做中间校验,失败就跳过后续处理,但还希望继续尝试
- 容易踩的坑:误以为
continue等价于「重来一次」,实际它不触发do块重入,只触发条件重判 - 如果想强制重跑
do块,只能用goto(不推荐)或重构为while(true)+break
和 while(true) + break 对比,选哪个?
功能上能互相替代,但语义不同:do-while 明确表达「至少一次 + 条件退出」;while(true) 是「无限循环 + 主动中断」,意图更模糊。
可读性上,前者让维护者一眼看出「这事必须干一回」;后者得逐行看 break 才知道在哪停。
- 兼容性无差别,PHP 所有版本都支持
- 性能差异可忽略,但
do-while少一次条件判断(首次进入不查) - 真正容易被忽略的是嵌套场景:在多层循环中,
break 2的行为在两种写法下一致,但人容易在while(true)里漏数层级










