C++ 中的循环语句详解:while、do...while、for、嵌套循环与循环控制

一、什么是循环?

在 C++ 程序中,很多时候我们需要让一段代码重复执行。

比如:

打印 1 到 100 的数字;

统计数组中所有元素的和;

不断读取用户输入,直到输入某个特定值;

遍历字符串、数组、vector 等容器。

如果不用循环,我们可能要写很多重复代码:

复制代码
cout << 1 << endl;
cout << 2 << endl;
cout << 3 << endl;
cout << 4 << endl;
cout << 5 << endl;

这样写不仅麻烦,而且不灵活。如果要打印 1 到 10000,就几乎不现实了。

这时候就需要使用循环语句

循环的核心作用就是:

在满足某个条件的情况下,重复执行一段代码。

C++ 中常见的循环结构主要有 while 循环、do...while 循环、for 循环以及嵌套循环。菜鸟教程中也将这些作为 C++ 循环的主要类型进行介绍,并补充了 breakcontinuegoto 等循环控制语句。(runoob.com)


二、while 循环

1. 基本语法

复制代码
while (条件表达式) {
    循环体;
}

执行流程是:

先判断条件表达式;

如果条件为 true,执行循环体;

执行完循环体后,再次判断条件;

只要条件一直为 true,循环就会一直执行;

当条件变为 false 时,循环结束。


2. 示例:输出 1 到 5

复制代码
#include <iostream>
using namespace std;

int main() {
    int i = 1;

    while (i <= 5) {
        cout << i << endl;
        i++;
    }

    return 0;
}

输出结果:

复制代码
1
2
3
4
5

3. 执行过程分析

复制代码
int i = 1;

一开始 i 的值是 1。

第一次判断:

复制代码
i <= 5

也就是:

复制代码
1 <= 5

条件成立,输出 1,然后执行:

复制代码
i++;

此时 i 变成 2。

接着继续判断:

复制代码
2 <= 5

成立,输出 2。

循环不断执行,直到 i 变成 6,此时:

复制代码
6 <= 5

条件不成立,循环结束。


4. while 循环的特点

while 循环适合用于循环次数不一定明确的情况。

例如:

不断读取用户输入;

不断判断某个条件是否满足;

只要条件成立就继续执行。

示例:

复制代码
#include <iostream>
using namespace std;

int main() {
    int num;

    cout << "请输入一个数字,输入 0 结束:" << endl;
    cin >> num;

    while (num != 0) {
        cout << "你输入的是:" << num << endl;
        cin >> num;
    }

    cout << "程序结束" << endl;

    return 0;
}

这个程序会一直让用户输入数字,直到用户输入 0 为止。


三、do...while 循环

1. 基本语法

复制代码
do {
    循环体;
} while (条件表达式);

do...whilewhile 的最大区别是:

do...while 会先执行一次循环体,然后再判断条件。

也就是说,无论条件一开始是否成立,do...while 的循环体至少会执行一次。


2. 示例:输出 1 到 5

复制代码
#include <iostream>
using namespace std;

int main() {
    int i = 1;

    do {
        cout << i << endl;
        i++;
    } while (i <= 5);

    return 0;
}

输出结果:

复制代码
1
2
3
4
5

3. do...while 至少执行一次

看下面这个例子:

复制代码
#include <iostream>
using namespace std;

int main() {
    int i = 10;

    do {
        cout << "当前 i 的值是:" << i << endl;
        i++;
    } while (i <= 5);

    return 0;
}

输出结果:

复制代码
当前 i 的值是:10

虽然一开始 i <= 5 这个条件就是假的,但是程序仍然执行了一次循环体。

这就是 do...while 的特点。


4. do...while 适合什么场景?

do...while 适合用于至少需要执行一次的场景。

例如:

菜单选择;

用户登录;

输入校验;

游戏主循环。

示例:简单菜单程序

复制代码
#include <iostream>
using namespace std;

int main() {
    int choice;

    do {
        cout << "===== 菜单 =====" << endl;
        cout << "1. 开始游戏" << endl;
        cout << "2. 查看说明" << endl;
        cout << "0. 退出程序" << endl;
        cout << "请输入你的选择:";
        cin >> choice;

        if (choice == 1) {
            cout << "游戏开始!" << endl;
        } else if (choice == 2) {
            cout << "这里是游戏说明。" << endl;
        } else if (choice == 0) {
            cout << "程序退出。" << endl;
        } else {
            cout << "输入无效,请重新输入。" << endl;
        }

    } while (choice != 0);

    return 0;
}

在这个例子中,菜单至少要显示一次,所以使用 do...while 很合适。


四、for 循环

1. 基本语法

复制代码
for (初始化语句; 条件表达式; 更新语句) {
    循环体;
}

for 循环通常用于循环次数比较明确的情况。

例如:

输出 1 到 100;

遍历数组;

遍历字符串;

执行固定次数的操作。


2. for 循环执行流程

复制代码
for (int i = 1; i <= 5; i++) {
    cout << i << endl;
}

执行顺序如下:

第一步:执行初始化语句

复制代码
int i = 1;

第二步:判断条件

复制代码
i <= 5;

第三步:如果条件成立,执行循环体

复制代码
cout << i << endl;

第四步:执行更新语句

复制代码
i++;

第五步:回到第二步,继续判断条件。


3. 示例:输出 1 到 5

复制代码
#include <iostream>
using namespace std;

int main() {
    for (int i = 1; i <= 5; i++) {
        cout << i << endl;
    }

    return 0;
}

输出结果:

复制代码
1
2
3
4
5

4. 示例:计算 1 到 100 的和

复制代码
#include <iostream>
using namespace std;

int main() {
    int sum = 0;

    for (int i = 1; i <= 100; i++) {
        sum += i;
    }

    cout << "1 到 100 的和是:" << sum << endl;

    return 0;
}

输出结果:

复制代码
1 到 100 的和是:5050

5. for 循环适合遍历数组

复制代码
#include <iostream>
using namespace std;

int main() {
    int arr[5] = {10, 20, 30, 40, 50};

    for (int i = 0; i < 5; i++) {
        cout << arr[i] << endl;
    }

    return 0;
}

输出结果:

复制代码
10
20
30
40
50

数组下标从 0 开始,所以这里的循环条件是:

复制代码
i < 5

而不是:

复制代码
i <= 5

如果写成 i <= 5,就会访问 arr[5],造成数组越界。


五、while、do...while、for 的区别

循环类型 判断条件的位置 是否至少执行一次 适用场景
while 循环开始前 不一定 循环次数不确定
do...while 循环结束后 至少执行一次的场景
for 循环开始前 不一定 循环次数明确

简单来说:

如果循环次数明确,优先考虑 for

如果循环次数不明确,优先考虑 while

如果循环体至少要执行一次,使用 do...while


六、嵌套循环

1. 什么是嵌套循环?

嵌套循环就是:

在一个循环里面再写一个循环。

例如:

复制代码
for (int i = 1; i <= 3; i++) {
    for (int j = 1; j <= 3; j++) {
        cout << i << " " << j << endl;
    }
}

外层循环每执行一次,内层循环都会完整执行一遍。


2. 示例:输出 3 行 5 列的星号

复制代码
#include <iostream>
using namespace std;

int main() {
    for (int i = 1; i <= 3; i++) {
        for (int j = 1; j <= 5; j++) {
            cout << "*";
        }
        cout << endl;
    }

    return 0;
}

输出结果:

复制代码
*****
*****
*****

分析:

外层循环控制行数;

内层循环控制每一行输出多少个星号。


3. 示例:输出直角三角形

复制代码
#include <iostream>
using namespace std;

int main() {
    for (int i = 1; i <= 5; i++) {
        for (int j = 1; j <= i; j++) {
            cout << "*";
        }
        cout << endl;
    }

    return 0;
}

输出结果:

复制代码
*
**
***
****
*****

这里的关键在于:

复制代码
j <= i

i = 1 时,输出 1 个星号;

i = 2 时,输出 2 个星号;

i = 3 时,输出 3 个星号;

以此类推。


4. 示例:九九乘法表

复制代码
#include <iostream>
#include <iomanip>
using namespace std;

int main() {
    for (int i = 1; i <= 9; i++) {
        for (int j = 1; j <= i; j++) {
            cout << j << " * " << i << " = " << setw(2) << i * j << "  ";
        }
        cout << endl;
    }

    return 0;
}

输出结果:

复制代码
1 * 1 =  1
1 * 2 =  2  2 * 2 =  4
1 * 3 =  3  2 * 3 =  6  3 * 3 =  9
1 * 4 =  4  2 * 4 =  8  3 * 4 = 12  4 * 4 = 16
...

在这个程序中:

外层循环 i 控制行;

内层循环 j 控制列;

setw(2) 用来控制输出宽度,让结果更整齐。


七、break 语句

1. break 的作用

break 的作用是:

立即结束当前循环。

只要程序执行到 break,当前循环就会被终止。

菜鸟教程中也说明,break 可以终止循环或 switch 语句,程序会继续执行循环或 switch 后面的语句。(runoob.com)


2. 示例:遇到 5 就停止循环

复制代码
#include <iostream>
using namespace std;

int main() {
    for (int i = 1; i <= 10; i++) {
        if (i == 5) {
            break;
        }

        cout << i << endl;
    }

    return 0;
}

输出结果:

复制代码
1
2
3
4

i == 5 时,执行 break,整个循环立即结束,所以 5 不会被输出。


3. break 在嵌套循环中的作用

复制代码
#include <iostream>
using namespace std;

int main() {
    for (int i = 1; i <= 3; i++) {
        for (int j = 1; j <= 3; j++) {
            if (j == 2) {
                break;
            }
            cout << "i = " << i << ", j = " << j << endl;
        }
    }

    return 0;
}

输出结果:

复制代码
i = 1, j = 1
i = 2, j = 1
i = 3, j = 1

注意:

break 只会结束它所在的那一层循环。

在这个例子中,break 只结束内层循环,不会结束外层循环。


八、continue 语句

1. continue 的作用

continue 的作用是:

跳过本次循环中剩下的代码,直接进入下一次循环。

菜鸟教程中对 continue 的解释是,它会让循环跳过循环体剩余部分,重新开始测试条件。(runoob.com)


2. 示例:跳过数字 5

复制代码
#include <iostream>
using namespace std;

int main() {
    for (int i = 1; i <= 10; i++) {
        if (i == 5) {
            continue;
        }

        cout << i << endl;
    }

    return 0;
}

输出结果:

复制代码
1
2
3
4
6
7
8
9
10

i == 5 时,执行 continue,跳过本次输出,所以 5 不会被打印。

但是循环并没有结束,而是继续执行后面的 6、7、8、9、10。


九、break 和 continue 的区别

语句 作用 是否结束整个循环
break 直接结束当前循环
continue 跳过本次循环,进入下一次循环

举个简单的比喻:

break 是"不干了,整个循环结束";

continue 是"这一次跳过,下一次继续"。


十、无限循环

1. 什么是无限循环?

如果循环条件一直为真,循环就不会结束,这种情况叫做无限循环

例如:

复制代码
while (true) {
    cout << "hello" << endl;
}

这段代码会一直输出 hello,除非程序被强制终止。


2. for 写法的无限循环

复制代码
for (;;) {
    cout << "这是一个无限循环" << endl;
}

在 C++ 中,for 循环的三个表达式都可以省略,因此 for(;;) 经常被用来表示无限循环。菜鸟教程中也提到,当条件表达式不存在时,通常会被视为真,很多 C++ 程序员会使用 for(;;) 表示无限循环。(runoob.com)


3. 无限循环的实际使用

无限循环并不一定是错误,有时候它是有用的。

例如服务器程序、游戏主循环、菜单系统中,程序需要不断运行,直到用户选择退出。

复制代码
#include <iostream>
using namespace std;

int main() {
    int choice;

    while (true) {
        cout << "1. 继续" << endl;
        cout << "0. 退出" << endl;
        cout << "请输入选择:";
        cin >> choice;

        if (choice == 0) {
            break;
        }

        cout << "程序继续运行..." << endl;
    }

    cout << "程序结束" << endl;

    return 0;
}

这里使用了无限循环,但是通过 break 控制退出。


十一、循环中常见错误

1. 忘记更新循环变量

错误示例:

复制代码
int i = 1;

while (i <= 5) {
    cout << i << endl;
}

这个程序会一直输出 1,因为 i 的值一直没有变化。

正确写法:

复制代码
int i = 1;

while (i <= 5) {
    cout << i << endl;
    i++;
}

2. 条件写错导致循环次数异常

错误示例:

复制代码
for (int i = 1; i < 5; i++) {
    cout << i << endl;
}

如果你的目标是输出 1 到 5,那么这个条件写错了。

它只会输出:

复制代码
1
2
3
4

正确写法:

复制代码
for (int i = 1; i <= 5; i++) {
    cout << i << endl;
}

3. 数组越界

错误示例:

复制代码
int arr[5] = {10, 20, 30, 40, 50};

for (int i = 0; i <= 5; i++) {
    cout << arr[i] << endl;
}

数组 arr 的合法下标是:

复制代码
0, 1, 2, 3, 4

但是 i <= 5 会访问到 arr[5],这是越界访问。

正确写法:

复制代码
for (int i = 0; i < 5; i++) {
    cout << arr[i] << endl;
}

4. 分号位置错误

错误示例:

复制代码
for (int i = 1; i <= 5; i++);
{
    cout << "hello" << endl;
}

这里 for 后面多了一个分号:

复制代码
for (int i = 1; i <= 5; i++);

这个分号会让循环体变成空语句,后面的代码块只会执行一次。

正确写法:

复制代码
for (int i = 1; i <= 5; i++) {
    cout << "hello" << endl;
}

十二、综合案例:统计学生成绩

需求:

输入 5 名学生的成绩,计算总分和平均分。

复制代码
#include <iostream>
using namespace std;

int main() {
    int score;
    int sum = 0;

    for (int i = 1; i <= 5; i++) {
        cout << "请输入第 " << i << " 名学生的成绩:";
        cin >> score;

        sum += score;
    }

    double average = sum / 5.0;

    cout << "总分是:" << sum << endl;
    cout << "平均分是:" << average << endl;

    return 0;
}

这个案例中,循环执行了 5 次,每次输入一个学生成绩,并将成绩累加到 sum 中。


十三、综合案例:判断一个数是否为素数

素数是指只能被 1 和它本身整除的正整数。

例如:

2、3、5、7、11 是素数;

4、6、8、9、10 不是素数。

代码如下:

复制代码
#include <iostream>
using namespace std;

int main() {
    int n;
    bool isPrime = true;

    cout << "请输入一个整数:";
    cin >> n;

    if (n <= 1) {
        isPrime = false;
    } else {
        for (int i = 2; i < n; i++) {
            if (n % i == 0) {
                isPrime = false;
                break;
            }
        }
    }

    if (isPrime) {
        cout << n << " 是素数" << endl;
    } else {
        cout << n << " 不是素数" << endl;
    }

    return 0;
}

这段代码中:

for 循环用于尝试寻找 n 的因数;

如果找到某个 i 可以整除 n,说明 n 不是素数;

此时使用 break 直接结束循环,提高效率。


十四、总结

C++ 中的循环语句是程序控制结构中非常重要的一部分。

本文主要介绍了以下内容:

while 循环:适合循环次数不确定的场景;

do...while 循环:适合至少执行一次的场景;

for 循环:适合循环次数明确的场景;

嵌套循环:适合处理二维结构、图形输出、乘法表等问题;

break:用于直接结束当前循环;

continue:用于跳过本次循环,继续下一次循环;

无限循环:在菜单、服务器、游戏循环等场景中经常使用。

对于初学者来说,掌握循环的关键不是死记语法,而是理解三个问题:

第一,循环从哪里开始?

第二,循环什么时候结束?

第三,每次循环之后,变量如何变化?

只要把这三个问题想清楚,循环结构就会变得非常容易理解。

参考资料

本文结构参考了菜鸟教程中对 C++ 循环类型、循环控制语句和无限循环的基础介绍,并在此基础上重新整理、扩展了示例和讲解。(runoob.com)

相关推荐
XMYX-03 小时前
37 - Go env 环境变量:配置管理与运行时控制
开发语言·golang
不做无法实现的梦~3 小时前
运动控制系统复习一览-----常考题目总结版本
算法
小短腿的代码世界3 小时前
信号路由风暴:Qt算法交易系统的高频信号分发架构
qt·算法·架构
阿文的代码库3 小时前
一文读懂GROUP BY 1,2 VS GROUP BY column_1, column_2 的区别
算法
一楼的猫3 小时前
从文本特征分析看网文平台AI检测:3个被忽视的指标
开发语言·人工智能·学习方法·ai编程·ai写作·ai自动写作
yuan199973 小时前
基于MATLAB的梁非线性动力学方程编程实现框架
开发语言·matlab
Xin_ye100863 小时前
C# 零基础到精通教程 - 第十一章:LINQ——语言集成查询
开发语言·c#
欧米欧3 小时前
C++进阶数据结构之搜索二叉树
开发语言·数据结构·c++
青小莫3 小时前
C++之vector讲解
c++·stl