🔷 第五章 循环语句
📄 一句话概括

do { 循环体 } while (条件); —— 先跑后验:不管三七二十一先执行一圈,跑完才看条件,真就再来。它和 while 只差"第一次":while 可能一次不跑,do...while 至少跑一次。实例02 用它重算 1 到 10 的累加,结果还是 55——任务相同时两个循环能互换;但"先问再做"的活儿只有它干得顺手。

📝 本节和前面几节的关系

5.1.1 的 while 是"先验后跑",本篇把判断挪到循环体后面,就得到 do...while——三要素一个没少,只换了位置。它还带一个专属记号:末尾分号(while (条件);),这是和 4.2"分号空语句坑"完全不同的两回事——这里必须有分号。

一、do...while 的完整流程

do {
    循环体;   // 先干一圈
} while (继续条件);   // ← 末尾分号必须有

执行顺序:执行 → 判条件 → 真 → 再执行 → … → 假 → 出循环。判断位置从"门口"挪到了"门口外一圈"——所以循环体至少执行一次。

while(5.1.1) do...while
判断时机 进门前验票 上车后补票
最少执行 0 次 1 次
末尾分号 不需要 必须

二、实例 02:用 do...while 计算 1 到 10 的累加结果

#include <iostream>
using namespace std;

int main() {
    int i = 1;
    int sum = 0;

    do {
        sum += i;      // 先攒一笔
        i++;           // 更新照旧
    } while (i <= 10); // 末尾分号!

    cout << "1 到 10 的累加结果是 " << sum << endl;
    return 0;
}

看到什么算成功:输出 55——和实例01 一模一样。条件满足时,两个循环完全等价;差别只在初始条件就不满足的时刻(见下面实验)。

三、什么时候必须用它:先问再做的场景

输入校验是最典型用法——总得先收一次输入,才知道对不对:

int score;
do {
    cout << "请输入 0~100 的分数:";
    cin >> score;
} while (score < 0 || score > 100);   // 不合格就重收

cout << "收到:" << score << endl;

看到什么算成功:输入 150 会再问一遍;输入 85 直接通过。逻辑读出来就是大白话:"收一次分数,当不合格时再收一次。"

30 秒实验:把实例02 的 int i = 1; 改成 int i = 99;(初始化就超标)——while 版输出 0(一次不跑),do...while 版输出 99(硬跑了一圈)。"至少一次"不是优惠,是义务:初始值不干净时它会替你"办错事"。

四、常见误区

  1. "末尾分号可写可不写"——必须写。do {...} while (条件) 没分号直接语法错误;而 4.2 里 if (...) ; 的分号是"多写才出错"——一个不能少、一个不能多,别混。
  2. "while 括号后面再加分号"——} while (条件); 的分号已含在写法里,再画蛇添足写成 } while (条件); ; 倒不至于死循环,但 do {...} while (条件) 中途写成 do {...}; while(...) 就拆散了结构。
  3. "循环体里忘更新"——先跑后验更依赖更新:条件在跑完一圈后才看,不更新照样死循环(而且至少已经错了一圈)。
自测三问(点开对答案) 1. do...while 与 while 的唯一行为差别?——do...while 循环体至少执行 1 次(先跑后验)。 2. `} while (i <= 10);` 末尾的分号漏了会怎样?——语法错误,编译不过。 3. 什么场景非 do...while 不可?——"先做一次再判断"的场景:菜单显示、输入校验。

相关笔记