上一节我们学习了条件判断,这一节来学习循环结构。循环让程序能够重复执行某段代码,直到满足特定条件为止。C++ 提供了三种循环语句:while、for 和 do-while。
1. while 循环:先判断后执行
while 循环在每次执行前先检查条件,如果条件为 true 就执行循环体,否则退出循环。
1.1 基本语法
cpp
while (条件) {
// 循环体:条件为 true 时重复执行
}
1.2 实例:打印 1 到 5
cpp
#include <iostream>
using namespace std;
int main() {
int i = 1;
while (i <= 5) {
cout << i << " ";
i++;
}
cout << endl;
return 0;
}
输出结果:1 2 3 4 5
这里 i++ 是 i = i + 1 的简写,每次循环让 i 增加 1。如果没有这行,i 永远是 1,条件 i <= 5 永远成立,就会变成死循环。
1.3 实例:计算 1 到 100 的和
cpp
#include <iostream>
using namespace std;
int main() {
int sum = 0;
int i = 1;
while (i <= 100) {
sum += i; // 等价于 sum = sum + i
i++;
}
cout << "1 到 100 的和为:" << sum << endl;
return 0;
}
输出结果:1 到 100 的和为:5050
2. for 循环:计数循环的首选
for 循环把初始化、条件判断、更新三个部分写在一行,结构更紧凑,特别适合已知循环次数的场景。
2.1 基本语法
cpp
for (初始化; 条件; 更新) {
// 循环体
}
执行顺序:初始化 → 判断条件 → 执行循环体 → 更新 → 判断条件 → ......
2.2 实例:打印 1 到 5
cpp
#include <iostream>
using namespace std;
int main() {
for (int i = 1; i <= 5; i++) {
cout << i << " ";
}
cout << endl;
return 0;
}
这段代码和上面 while 的例子效果完全一样,但写法更简洁。for 循环把变量初始化、循环条件、变量更新都集中在一行,逻辑一目了然。
2.3 实例:计算阶乘
计算 5 的阶乘(5! = 5 × 4 × 3 × 2 × 1):
cpp
#include <iostream>
using namespace std;
int main() {
int n = 5;
int factorial = 1;
for (int i = 1; i <= n; i++) {
factorial *= i; // 等价于 factorial = factorial * i
}
cout << n << "! = " << factorial << endl;
return 0;
}
输出结果:5! = 120
2.4 for 循环的变体
for 循环的三个部分都可以省略(但分号不能省):
cpp
// 省略初始化(在循环外初始化)
int i = 0;
for (; i < 5; i++) { ... }
// 省略更新(在循环体内更新)
for (int i = 0; i < 5; ) {
cout << i << endl;
i++;
}
// 无限循环(不推荐,除非配合 break 使用)
for (;;) {
// 无限循环
}
3. do-while 循环:先执行后判断
do-while 循环先执行一次循环体,再判断条件。也就是说,无论条件是否成立,循环体至少会执行一次。
3.1 基本语法
cpp
do {
// 循环体:至少执行一次
} while (条件); // 注意这里有分号
3.2 实例:简单的猜数字游戏
cpp
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main() {
srand(time(0)); // 用当前时间作为随机数种子
int target = rand() % 100 + 1; // 生成 1-100 的随机数
int guess;
do {
cout << "猜一个 1-100 的数字:";
cin >> guess;
if (guess > target) {
cout << "大了!" << endl;
} else if (guess < target) {
cout << "小了!" << endl;
}
} while (guess != target);
cout << "恭喜你猜对了!" << endl;
return 0;
}
这个例子中,玩家至少要猜一次才能知道结果,所以用 do-while 比 while 更合适。
4. 循环控制:break 和 continue
4.1 break:立即跳出循环
cpp
#include <iostream>
using namespace std;
int main() {
for (int i = 1; i <= 10; i++) {
if (i == 6) {
break; // 当 i 等于 6 时跳出循环
}
cout << i << " ";
}
cout << endl;
return 0;
}
输出结果:1 2 3 4 5
4.2 continue:跳过本次循环
cpp
#include <iostream>
using namespace std;
int main() {
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) {
continue; // 跳过偶数
}
cout << i << " ";
}
cout << endl;
return 0;
}
输出结果:1 3 5 7 9
5. 嵌套循环
循环可以嵌套使用,外层循环每执行一次,内层循环就完整执行一遍。
5.1 实例:打印九九乘法表
cpp
#include <iostream>
using namespace std;
int main() {
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
cout << j << " × " << i << " = " << i * j << "\t";
}
cout << endl;
}
return 0;
}
这段代码会输出完整的九九乘法表。\t 是制表符,用来对齐输出。
6. 三种循环怎么选
简单原则:
- 已知循环次数 → 用
for - 不知道循环次数,但知道结束条件 → 用
while - 循环体至少执行一次 → 用
do-while
实际开发中 for 用得最多,while 次之,do-while 较少使用。
7. 常见错误
7.1 死循环
忘记更新循环变量会导致死循环:
cpp
// 错误:i 永远是 1
int i = 1;
while (i <= 5) {
cout << i << endl;
// 忘记 i++
}
7.2 循环变量作用域
在 for 循环初始化中声明的变量,只在循环内部有效:
cpp
for (int i = 0; i < 5; i++) {
// i 在这里有效
}
// cout << i; // 错误:i 未定义
8. 小结
这一节我们学习了三种循环结构:while 适合条件循环,for 适合计数循环,do-while 适合至少执行一次的场景。重点掌握 for 循环的写法和 break、continue 的用法。下一节我们将学习函数,让代码更加模块化。