📖 学习信息
学习课程:黑马 C++ 零基础入门教程
本日学习:C++ 程序流程结构之循环语句包含:while 循环、do-while 循环、for 循环、循环嵌套、break/continue 跳转语句、综合实战案例
一、前言
循环结构是程序中重复执行某段代码的核心机制,能极大减少代码冗余,是所有复杂程序的基础。实际开发中,90% 以上的重复逻辑都需要用循环实现,比如遍历数组、累加求和、游戏主循环等。C++ 提供了三种循环语句:while、do-while、for,各有适用场景,本篇一次性讲透。
二、while 循环
while 循环是先判断条件,再执行代码,如果条件一开始就为假,循环体一次都不会执行。
1. 基础语法
while (循环条件) {
// 循环体:需要重复执行的代码
// 循环变量更新(必须有,否则会变成死循环)
}
2. 执行逻辑
- 判断循环条件是否为真(非 0)
- 条件为真 → 执行循环体 → 回到步骤 1
- 条件为假 → 跳出循环,执行后续代码
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. 执行逻辑
- 先执行一次循环体
- 判断循环条件是否为真
- 条件为真 → 再次执行循环体 → 回到步骤 2
- 条件为假 → 跳出循环
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. 执行流程(重点)
- 只执行一次:初始化表达式(定义循环变量并赋值)
- 判断条件表达式是否为真
- 条件为真 → 执行循环体 → 执行更新表达式 → 回到步骤 2
- 条件为假 → 跳出循环
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×1=1
1×2=2 2×2=4
1×3=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。
八、常见错误与避坑点
- 死循环(最常见)
// 错误:忘记更新循环变量i,i永远等于1,条件永远为真
int i = 1;
while (i <= 10) {
cout << i << endl;
// 缺少 i++;
}
- for 循环分号写错
// 错误:for后面多写分号,循环体变成空语句
for (int i = 1; i <= 10; i++); {
cout << i << endl; // 只会执行一次,输出11
}
- break 只能跳出一层循环
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
if (j == 2) {
break; // 只跳出内层循环,外层循环继续执行
}
cout << i << " " << j << endl;
}
}
- 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;
}
十、今日学习总结
-
while 循环:先判断后执行,适合不确定循环次数的场景;
-
do-while 循环:先执行后判断,至少执行一次,适合必须先操作的场景;
-
for 循环:最常用,结构清晰,适合知道循环次数的场景;
-
循环嵌套:外层控制行数,内层控制列数,经典应用九九乘法表;
-
跳转语句:
- break:跳出整个当前循环
- continue:跳过本次循环,进入下一次
-
避坑重点:避免死循环、不要写错分号、区分 break 和 continue 的作用。
✍️ 下节预告
下一篇将学习 C++ 数组:一维数组、二维数组的定义与使用,以及数组的常见操作(遍历、求和、查找、排序),继续夯实基础语法。