InfoCode

C++ · 控制结构

循环结构

比较 for、while 与 do-while 的执行顺序,用求和与结束标记例子理解循环次数、终止条件及常见边界错误。

InfoCode 编写 · 技术参考见下文

在应用中练这个知识点 在应用中阅读讲解

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加112
2加233
3continue,不累加34
4加475
5加5126

接着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 为零时一次不执行,就会误判零有零位。

提示

先修知识

技术参考

范围说明

本站讲解由 InfoCode 编写,不是官方考纲;参考级别是本站映射,不代表官方等级、认证或参赛资格。练习记录不等于掌握或资格。

参考级别:GESP 1 级(本站映射)

查看赛事关系与路径