for——把循环变量的初始化、判断、更新
三件事收进一行,专治“循环次数已知”的场景。再学两个循环里的“急刹车”:
break 提前跳出整个循环,continue 跳过本次、继续下一轮。
for——把循环变量的初始化、判断、更新
三件事收进一行,专治“循环次数已知”的场景。再学两个循环里的“急刹车”:
break 提前跳出整个循环,continue 跳过本次、继续下一轮。
上节课写 while 时,循环变量的三个动作分散在不同位置:
初始化在循环之前,判断在圆括号里,更新藏在循环体最后。一不小心忘了更新,就是死循环。
当循环次数写代码时就确定(比如“正好跑 5 次”),
for 能把这三件事排在同一行,一眼看全,也更不容易漏掉更新。
圆括号里用两个分号隔成三段,正好对应循环变量的三个动作:
| 段 | 作用 | 执行时机 |
|---|---|---|
| int i = 1 | 初始化 | 循环开始前,只做一次 |
| i <= 5 | 判断 | 每轮开始前都检查 |
| i++ | 更新 | 每轮循环体执行完后 |
while 版:三件事分散三处
int i = 1;
while (i <= 5) {
std::cout << i;
i++;
}
for 版:三件事收进一行
for (int i = 1; i <= 5; i++) {
std::cout << i;
}
for 更紧凑,次数看运行情况用 while 更自然。
“从 1 加到 100”是循环最经典的练手题:循环次数(100 次)写代码时就知道,
正是 for 的主场。关键是循环体外先准备一个累加器 sum,
每轮把 i 加进去。
#include <iostream>
int main() {
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i; // sum = sum + i
}
std::cout << "1 到 100 的总和是:" << sum << std::endl;
return 0;
} sum += i; 是 sum = sum + i; 的简写,叫复合赋值。
同理还有 -=、*=、/=。它和 ++ 一样,是 C++ 里
“在自己原来的值上做改动”的常用简写。
int sum = 0; 必须写在 for 之前。
如果写进循环体,每轮都被重置成 0,加了等于没加。
有时循环还没到条件结束,就已经“拿到想要的结果”了——比如在一堆数里
找到第一个符合要求的就够了,没必要再找下去。
break 的作用就是立刻跳出整个循环,执行循环后面的代码。
for (int i = 1; i <= 10; i++) {
if (i == 5) {
break; // 一到 5 就跳出整个循环
}
std::cout << i << " ";
}
// 输出:1 2 3 4 continue 和 break 容易混。区别是:
break 是整个循环都不要了;
continue 只是本轮剩下的代码不执行,
然后照常进入下一轮(for 会先做更新再判断)。
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) {
continue; // 偶数就跳过本次,直接进入下一轮
}
std::cout << i << " ";
}
// 输出:1 3 5 7 9 break = 离场(循环结束);continue = 跳过(这轮算了,下轮接着来)。
把 break_demo.cpp 里的 break 改成 continue,先猜输出是什么,再运行验证。
i == 5 这一轮被跳过,那 6 到 10 还会打印吗?
读入一个正整数 n,用 for 算出 n!
(即 1 × 2 × 3 × … × n)并输出。
提示:和累加求和几乎一样,但累乘的“累加器”初始值要设成 1 而不是 0——想想为什么。
读入一个大于 1 的整数,判断它是不是质数(只能被 1 和自身整除)。
思路:用 for 从 2 试到 n-1,
只要发现有一个数能整除 n(n % i == 0),它就不是质数——
这时用 break 提前跳出,不用再试下去。
bool isPrime = true;),找到因子时把它改成
false 再 break。
打印 1 到 50,但凡是 7 的倍数(7、14、21……)都跳过不打印。
提示:这正是 continue 的主场——条件成立就 continue,跳过本次打印。
| 能力 | 用到的工具 |
|---|---|
| 已知次数的循环 | for (初始化; 判断; 更新) |
| 累加 / 累乘 | 循环外的累加器 + += / *= |
| 提前结束循环 | break |
| 跳过本轮 | continue |
while 和 for 都能写循环,挑选标准就一句话:
次数定死用 for,看运行情况用 while。