📄 一句话概括
循环的"方向盘"就是控制变量——它在条件里把关,条件只认它。同一个变量有三种身份:计数器(数圈数)、累加器(攒结果)、哨兵(看数据里约定的"停"暗号)。每个控制变量都要走完三项职责:进循环前定初值、每圈按规矩更新、在条件里被检查。
📝 本节和前面几节的关系
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。两个细节:
cin >> x && x != 0的短路求值(3.1.3)在保命:cin失败(比如输入字母)时右边不再执行,循环正常收工,不会拿垃圾值去累加。(double)sum / count是 3.3.2 的老课:不转 double 就整除丢小数(80+90+100)/3 = 90 恰好整,试试 1 2 2 → 应该是 1.666…,不转就变 1。
三、常见误区
- "控制变量随便一个字母就行"——
i、sum、count已经是最省的"人话";a、b1、temp2三周后自己都认不出。变量名是给人读的。 - "计数器初值写 0 也一样"——数到 10 的循环,初值 0 会多跑一圈(0 也进循环)少一个真数据;初值决定"数到几",写错就整体平移。
- "多个控制变量混着用"——计数器和累加器同框(上面的 count 与 sum)没问题,但要各自命名、各管一事;用一个变量干两件事(既数圈又攒和)必乱。
自测三问(点开对答案)
1. 哨兵循环里"谁"决定跑几圈?——数据:哨兵值(如 0)出现即停,圈数事先不知道。 2. 累加器一般出现在条件里吗?——不,它攒结果,条件是计数器/哨兵在把关。 3. `(double)sum / count` 不转 double 会怎样?——整数除法丢小数(3.3.2 的类型转换老课)。- ☐ 5.3.2 break 语句(下一节)
相关笔记
- while 和 do...while 循环 —— 三要素全景
- 逻辑运算符 —— 哨兵条件里的短路求值
- 表达式中的类型转换 ——
(double)sum / count的出处 - 🔷 C++基础 · 索引 —— 全课路线图