C++ 系统学习日记・第 06 天|流程结构:循环语句(while+do-while+for 全解 + 嵌套)

3 阅读7分钟

📖 学习信息

学习课程:黑马 C++ 零基础入门教程

本日学习:C++ 程序流程结构之循环语句包含:while 循环、do-while 循环、for 循环、循环嵌套、break/continue 跳转语句、综合实战案例


一、前言

循环结构是程序中重复执行某段代码的核心机制,能极大减少代码冗余,是所有复杂程序的基础。实际开发中,90% 以上的重复逻辑都需要用循环实现,比如遍历数组、累加求和、游戏主循环等。C++ 提供了三种循环语句:whiledo-whilefor,各有适用场景,本篇一次性讲透。


二、while 循环

while 循环是先判断条件,再执行代码,如果条件一开始就为假,循环体一次都不会执行。

1. 基础语法

while (循环条件) {
    // 循环体:需要重复执行的代码
    // 循环变量更新(必须有,否则会变成死循环)
}

2. 执行逻辑

  1. 判断循环条件是否为真(非 0)
  2. 条件为真 → 执行循环体 → 回到步骤 1
  3. 条件为假 → 跳出循环,执行后续代码

3. 经典示例:计算 1~100 的和

#include <iostream>
using namespace std;

int main()
{
    int sum = 0;    // 存储累加和
    int i = 1;      // 循环变量,从1开始

    while (i <= 100) {
        sum += i;   // 等价于 sum = sum + i
        i++;        // 循环变量自增,必须写!
    }

    cout << "1~100的和为:" << sum << endl;  // 输出5050
    return 0;
}

三、do-while 循环

do-while 循环是先执行一次循环体,再判断条件,无论条件是否为真,循环体至少执行一次。

1. 基础语法

do {
    // 循环体:至少执行一次
    // 循环变量更新
} while (循环条件);  // 注意:末尾必须有分号

2. 执行逻辑

  1. 先执行一次循环体
  2. 判断循环条件是否为真
  3. 条件为真 → 再次执行循环体 → 回到步骤 2
  4. 条件为假 → 跳出循环

3. 示例:猜数字游戏(基础版)

#include <iostream>
using namespace std;

int main()
{
    int num;
    // 无论用户输入什么,至少执行一次输入操作
    do {
        cout << "请输入一个0~10之间的数字:";
        cin >> num;
    } while (num != 5);  // 直到输入5才退出循环

    cout << "恭喜你猜对了!" << endl;
    return 0;
}

4. while vs do-while 核心区别

表格

循环类型执行顺序循环体执行次数适用场景
while先判断,后执行0 次或多次不确定循环次数,可能一次都不执行
do-while先执行,后判断至少 1 次必须先执行一次操作,再判断是否继续

四、for 循环(最常用)

for 循环是 C++ 中最简洁、最常用的循环语句,将循环变量初始化、条件判断、变量更新整合在一行,结构清晰。

1. 基础语法

for (初始化表达式; 条件表达式; 更新表达式) {
    // 循环体
}

2. 执行流程(重点)

  1. 只执行一次:初始化表达式(定义循环变量并赋值)
  2. 判断条件表达式是否为真
  3. 条件为真 → 执行循环体 → 执行更新表达式 → 回到步骤 2
  4. 条件为假 → 跳出循环

3. 经典示例:计算 1~100 的和(for 版)

#include <iostream>
using namespace std;

int main()
{
    int sum = 0;
    // 初始化i=1;条件i<=100;每次循环i自增
    for (int i = 1; i <= 100; i++) {
        sum += i;
    }

    cout << "1~100的和为:" << sum << endl;
    return 0;
}

4. for 循环灵活写法

for 循环的三个表达式都可以省略,但分号不能省略:

// 省略初始化:循环变量在外部定义
int i = 1;
for (; i <= 100; i++) {
    sum += i;
}

// 省略更新:在循环体内更新
for (int i = 1; i <= 100;) {
    sum += i;
    i++;
}

// 全部省略:死循环(慎用)
for (;;) {
    cout << "死循环" << endl;
}

五、循环嵌套

循环内部可以再嵌套循环,称为循环嵌套,用于处理二维数据、多层逻辑,最经典的应用是打印九九乘法表。

1. 执行逻辑

外层循环执行一次,内层循环执行完整的一轮。

外层循环控制行数,内层循环控制列数

2. 经典案例:打印九九乘法表

#include <iostream>
using namespace std;

int main()
{
    // 外层循环:控制行数(1~9行)
    for (int i = 1; i <= 9; i++) {
        // 内层循环:控制列数(1~i列)
        for (int j = 1; j <= i; j++) {
            // 输出乘法表达式,用\t对齐
            cout << j << "×" << i << "=" << i*j << "\t";
        }
        // 每行结束后换行
        cout << endl;
    }

    return 0;
}

运行结果:

1=12=2	2×2=43=3	2×3=6	3×3=9	
...
1×9=9	2×9=18	...	9×9=81

六、跳转语句:break 和 continue

跳转语句用于改变循环的正常执行流程,提前跳出循环或跳过本次循环。

1. break 语句

作用:立即跳出当前所在的循环或 switch 语句,执行后续代码。

示例:找到第一个能被 7 整除的数

#include <iostream>
using namespace std;

int main()
{
    for (int i = 1; i <= 100; i++) {
        if (i % 7 == 0) {
            cout << "第一个能被7整除的数是:" << i << endl;
            break;  // 找到后立即跳出循环,不再执行后续循环
        }
    }

    return 0;
}

2. continue 语句

作用:跳过本次循环中剩余的代码,直接进入下一次循环的条件判断。

示例:输出 1~100 中所有的奇数

#include <iostream>
using namespace std;

int main()
{
    for (int i = 1; i <= 100; i++) {
        if (i % 2 == 0) {
            continue;  // 是偶数,跳过本次循环,不执行下面的输出
        }
        cout << i << " ";
    }

    return 0;
}

3. break vs continue 核心区别

表格

语句作用影响范围
break跳出整个循环终止当前循环的所有执行
continue跳过本次循环只影响当前一次循环,后续循环继续执行

七、三种循环对比与选择建议

表格

循环类型优点缺点适用场景
while语法简单,适合不确定循环次数的场景循环变量更新容易遗漏,导致死循环不知道循环次数,需要先判断条件
do-while至少执行一次循环体用得较少,容易忘记末尾分号必须先执行一次操作,再判断是否继续
for结构清晰,循环变量、条件、更新集中在一行,不易出错语法相对复杂一点知道循环次数的场景(最常用)

开发建议:优先使用 for 循环,不确定循环次数用 while,必须先执行一次用 do-while。


八、常见错误与避坑点

  1. 死循环(最常见)
// 错误:忘记更新循环变量i,i永远等于1,条件永远为真
int i = 1;
while (i <= 10) {
    cout << i << endl;
    // 缺少 i++;
}
  1. for 循环分号写错
// 错误:for后面多写分号,循环体变成空语句
for (int i = 1; i <= 10; i++); {
    cout << i << endl;  // 只会执行一次,输出11
}
  1. break 只能跳出一层循环
for (int i = 1; i <= 3; i++) {
    for (int j = 1; j <= 3; j++) {
        if (j == 2) {
            break;  // 只跳出内层循环,外层循环继续执行
        }
        cout << i << " " << j << endl;
    }
}
  1. continue 用在 switch 中continue 只能用在循环中,不能用在 switch 中(switch 不是循环)。

九、综合实战案例:完整猜数字游戏

结合循环、选择语句、随机数,实现一个完整的猜数字游戏:

#include <iostream>
#include <cstdlib>   // 用于rand()和srand()
#include <ctime>     // 用于time()
using namespace std;

int main()
{
    // 设置随机数种子,确保每次运行生成不同的随机数
    srand((unsigned int)time(NULL));
    // 生成1~100之间的随机数
    int target = rand() % 100 + 1;
    int guess;
    int count = 0;  // 记录猜测次数

    cout << "欢迎来到猜数字游戏!" << endl;
    cout << "系统已经生成了一个1~100之间的随机数,请开始猜测:" << endl;

    while (true) {  // 无限循环,直到猜对才退出
        cin >> guess;
        count++;

        if (guess > target) {
            cout << "猜大了,请再试一次:" << endl;
        } else if (guess < target) {
            cout << "猜小了,请再试一次:" << endl;
        } else {
            cout << "恭喜你猜对了!" << endl;
            cout << "你一共猜了" << count << "次" << endl;
            break;  // 猜对了,跳出循环
        }
    }

    return 0;
}

十、今日学习总结

  1. while 循环:先判断后执行,适合不确定循环次数的场景;

  2. do-while 循环:先执行后判断,至少执行一次,适合必须先操作的场景;

  3. for 循环:最常用,结构清晰,适合知道循环次数的场景;

  4. 循环嵌套:外层控制行数,内层控制列数,经典应用九九乘法表;

  5. 跳转语句

    • break:跳出整个当前循环
    • continue:跳过本次循环,进入下一次
  6. 避坑重点:避免死循环、不要写错分号、区分 break 和 continue 的作用。


✍️ 下节预告

下一篇将学习 C++ 数组:一维数组、二维数组的定义与使用,以及数组的常见操作(遍历、求和、查找、排序),继续夯实基础语法。