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

循环的"方向盘"就是控制变量——它在条件里把关,条件只认它。同一个变量有三种身份:计数器(数圈数)、累加器(攒结果)、哨兵(看数据里约定的"停"暗号)。每个控制变量都要走完三项职责:进循环前定初值、每圈按规矩更新、在条件里被检查。

📝 本节和前面几节的关系

5.1 说"三要素缺一不可",本篇把三要素的主角单独拎出来讲:条件里那个变量是谁、它怎么变,决定循环的一切。哨兵循环是 while 的看家本领(圈数事先不知道),累加器则是实例01~03 一直在用的老搭档。

一、三种角色:同一套规矩,三种活

角色 初值 每圈做什么 圈数由谁定
计数器 i = 1 i++ 你定的上界(数到 10)
累加器 sum = 0 sum += i 一般不参与条件,只攒结果
哨兵 首个输入值 每圈换新输入 数据/用户(输 0 就停)

关键区别:计数器是"我知道要跑几圈",哨兵是"跑到数据说停为止"。

二、哨兵循环:圈数交给数据

#include <iostream>
using namespace std;

int main() {
    int x, sum = 0, count = 0;         // sum 累加、count 计数 两个控制变量

    cout << "输入若干个正整数(输入 0 结束):" << endl;
    while (cin >> x && x != 0) {       // 哨兵:0 是"停"的暗号 + 3.1.3 短路求值
        sum += x;
        count++;
    }

    if (count > 0)
        cout << "共 " << count << " 个数,平均 " << (double)sum / count << endl;
    else
        cout << "没有有效输入" << endl;
    return 0;
}

看到什么算成功:输入 80 90 100 0 输出 共 3 个数,平均 90。两个细节:

  1. cin >> x && x != 0 的短路求值(3.1.3)在保命:cin 失败(比如输入字母)时右边不再执行,循环正常收工,不会拿垃圾值去累加。
  2. (double)sum / count 是 3.3.2 的老课:不转 double 就整除丢小数(80+90+100)/3 = 90 恰好整,试试 1 2 2 → 应该是 1.666…,不转就变 1。

三、常见误区

  1. "控制变量随便一个字母就行"——i、sum、count 已经是最省的"人话";a、b1、temp2 三周后自己都认不出。变量名是给人读的。
  2. "计数器初值写 0 也一样"——数到 10 的循环,初值 0 会多跑一圈(0 也进循环)少一个真数据;初值决定"数到几",写错就整体平移。
  3. "多个控制变量混着用"——计数器和累加器同框(上面的 count 与 sum)没问题,但要各自命名、各管一事;用一个变量干两件事(既数圈又攒和)必乱。
自测三问(点开对答案) 1. 哨兵循环里"谁"决定跑几圈?——数据:哨兵值(如 0)出现即停,圈数事先不知道。 2. 累加器一般出现在条件里吗?——不,它攒结果,条件是计数器/哨兵在把关。 3. `(double)sum / count` 不转 double 会怎样?——整数除法丢小数(3.3.2 的类型转换老课)。

相关笔记