一、什么是循环?
在 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++ 循环的主要类型进行介绍,并补充了 break、continue、goto 等循环控制语句。(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...while 和 while 的最大区别是:
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)