C++ · 控制结构
循环结构
比较 for、while 与 do-while 的执行顺序,用求和与结束标记例子理解循环次数、终止条件及常见边界错误。
for、while 与 do-while 怎样执行
如果要输出 1 到 100,难道要写 100 行 cout 吗?当然不用——循环帮我们重复执行!
for 循环(已知重复次数时最常用):
for (初始化; 条件; 更新) {
// 循环体
}执行顺序:① 初始化(只执行一次)→ ② 判断条件 → ③ 执行循环体 → ④ 执行更新 → 回到②,直到条件为假。
while 循环(不确定次数,满足条件就继续):
while (条件) {
// 循环体
}while 先判断条件再执行。如果一开始条件就是假,一次都不执行。
break 立即跳出循环;continue 跳过本次循环剩余代码,进入下一次循环。
do-while:do { 循环体 } while (条件); 先执行一次再判断,所以即使初始条件为假也会运行一次,末尾分号不能省略。它适合至少尝试一次的流程,例如把非负整数拆成数位时,数字零也要处理一位。
for 与 while:同一任务怎样比较
求 1 到 5 的和时,for 可以把初值、条件和更新写在一起;while 把它们分开写。两种写法都先检查条件,因此循环体可能执行零次。do-while 先执行一次再检查。
int sum = 0;
for (int i = 1; i <= 5; ++i) sum += i;
int total = 0, j = 1;
while (j <= 5) { total += j; ++j; }两段结果都是 15。已知计数范围时 for 往往更直观;等待输入结束标记时 while 往往更直观。这是可读性选择,不代表一种语法总比另一种快。带 continue 的 for 会先做更新;改写为 while 时需检查是否漏掉更新。
先自己判断:把条件改成 i < 5,结果是多少?为什么少一次?
结果是 10,只累加 1、2、3、4;i 等于 5 时条件已为假。
跳过3以后,循环怎样继续?
从1加到5,但不加3。先预测最后的sum,再逐轮检查。for的更新发生在本轮结束时;continue跳过剩余循环体后,仍会执行更新,再检查条件。
| 本轮i | 本轮操作 | sum | 更新后的i |
|---|---|---|---|
| 1 | 加1 | 1 | 2 |
| 2 | 加2 | 3 | 3 |
| 3 | continue,不累加 | 3 | 4 |
| 4 | 加4 | 7 | 5 |
| 5 | 加5 | 12 | 6 |
接着6 <= 5为假,循环结束。常见错误一:for括号后多写分号,产生空循环体;缩进不会把后面的语句放进循环。错误二:把更新放到while循环体末尾,却在更新前continue,可能一直停在同一个值。比较写法时检查每条路径是否都推进或退出。
重复次数已知时常用for,等待条件变化时常用while,这是可读性选择,不是语法限制。不能仅凭for/while判断速度。n次常数工作为O(n),嵌套或提前退出要按实际执行次数分析。
运行验证:for中的continue仍执行更新
#include <iostream>
int main() {
int sum = 0;
for (int i = 1; i <= 5; ++i) {
if (i == 3) { continue; }
sum += i;
}
std::cout << sum << "\n";
}跳过3,得到1+2+4+5=12。循环最终停在条件不成立时。
先自己判断,再展开答案
从i=1开始,若上界改为0,执行几轮?
零轮,首次条件1 <= 0就是假;sum保持0。
while里先判断i==3就continue,最后才++i,会怎样?
若没有其他更新或退出,i停在3,条件若仍为真就无法结束。先找出卡住的状态,不必运行死循环。
检查数据时只想跳过当前不合格项、继续看后面,用break还是continue?
用continue,并保证循环仍有更新。break会退出最近一层循环。
求和、结束标记与循环边界
例1:for 循环输出 1 到 5 的和
#include <iostream>
using namespace std;
int main() {
int sum = 0;
for (int i = 1; i <= 5; i++) {
sum += i;
}
cout << sum << endl; // 输出 15
return 0;
}i 从 1 增到 5,每次把 i 加进 sum:0+1+2+3+4+5=15,循环结束后输出 15。
例2:while 循环不断读入直到 0
#include <iostream>
using namespace std;
int main() {
int n, sum = 0;
cin >> n;
while (n != 0) {
sum += n;
cin >> n;
}
cout << sum << endl;
return 0;
}输入 3 5 2 0,程序累加 3、5、2,读到 0 时退出循环,输出 10。
例3:零也有一位数字
#include <iostream>
using namespace std;
int main() {
int n = 0, digits = 0;
do { ++digits; n /= 10; } while (n != 0);
cout << digits << endl;
}输出 1。若直接 while(n!=0),初始 n 为零时一次不执行,就会误判零有零位。
提示
- for 循环条件里 i<=n 和 i<n+1 效果相同,但 i<n 和 i<=n 执行次数差 1,边界一定要想清楚。
- 循环变量 i 在 for 内部声明(int i=0)时,只在 for 循环内部有效,循环外无法使用。
- 死循环:如果条件永远为真,程序会卡住不动,竞赛中常见原因是更新语句写错了。
- break 跳出整个循环,continue 只跳过当次剩余代码而不退出循环。
- 循环体只有一条语句时可省略大括号,但为安全起见建议始终加大括号。
先修知识
技术参考
范围说明
本站讲解由 InfoCode 编写,不是官方考纲;参考级别是本站映射,不代表官方等级、认证或参赛资格。练习记录不等于掌握或资格。
参考级别:GESP 1 级(本站映射)