3. 循环语句
循环语句允许程序重复执行一段代码,直到满足某个退出条件。这是处理重复性任务、遍历数据集和实现许多算法的基础。
3.1 for 语句
1. 概念介绍
for 语句是C++中最常用的循环结构,特别适用于循环次数已知或循环变量有规律变化的情况。它将循环的初始化、条件判断和更新操作集中在一条语句中,结构清晰,易于阅读。
其基本结构为:for (initialization; condition; update) { // loop body }
- initialization: 初始化语句,在循环开始前仅执行一次。通常用于声明和初始化循环控制变量。
- condition: 条件表达式,在每次循环迭代开始前进行判断。如果为真,则执行循环体;如果为假,则退出循环。
- update: 更新语句,在每次循环体执行完毕后执行。通常用于修改循环控制变量,使其最终能使条件为假。
2. 算法步骤
- 执行 initialization 语句。
- 判断 condition 表达式的真假。
- 如果 condition 为
false,循环结束,程序跳转到for循环之后的代码。 - 如果 condition 为
true,则执行循环体内的代码。 - 执行 update 语句。
- 返回第 2 步,继续判断 condition。
3. 算法可视化SVG图示
4. 核心特性
- 结构紧凑: 将循环控制的三个关键部分放在一行,代码清晰。
- 作用域: 在
initialization中声明的变量,其作用域仅限于该for循环内部(包括条件和更新部分)。 - 灵活性:
initialization,condition,update三个部分都是可选的,可以省略。for(;;)就是一个无限循环。 - 可预测性: 非常适合于迭代次数在循环开始前就能确定的场景。
5. C++代码基础实现
#include <iostream>
int main() {
// 任务:计算 1 到 10 的整数之和
int sum = 0;
// for循环:
// 1. 初始化: int i = 1
// 2. 条件: i <= 10
// 3. 更新: ++i
for (int i = 1; i <= 10; ++i) {
sum += i;
}
std::cout << "1到10的和是: " << sum << std::endl; // 输出 55
return 0;
}
6. 优化策略
- 使用前置自增/自减 (
++i): 对于整数等内置类型,编译器通常会优化,与i++无异。但对于复杂类型(如迭代器),++i效率略高,因为它不需创建临时对象。养成使用++i的好习惯。 - 循环不变代码外提 (Loop-Invariant Code Motion): 将在循环中不会改变值的计算或函数调用移到循环外部。
- 减少循环内计算强度: 例如,用
i += 2代替i * 2(如果适用)。
7. 优缺点
- 优点:
-
- 语法清晰,可读性强,特别是对于固定次数的循环。
- 不易写成死循环,因为更新逻辑和条件判断紧密关联。
- 循环控制变量的作用域被限制在循环内,减少了命名冲突。
- 缺点:
-
- 对于循环次数不确定的情况(如等待用户输入特定值),使用
while循环可能更自然。
- 对于循环次数不确定的情况(如等待用户输入特定值),使用
8. 应用场景
- 遍历数组或容器:
for (int i = 0; i < array_size; ++i)是最经典的应用。 - 固定次数的计算: 如计算阶乘、斐波那契数列的前N项。
- 处理多组测试数据: 在信息学竞赛中,
for (int t = 0; t < T; ++t)用于处理 T 组输入数据。 - 生成序列或模式: 如打印九九乘法表。
9. 扩展
-
范围
for循环 (Range-based for loop, C++11): 一种更简洁、更安全的遍历容器的方式。#include <vector> std::vector<int> nums = {1, 2, 3, 4, 5}; for (int num : nums) { std::cout << num << " "; } -
多变量控制:
for循环的初始化和更新部分可以包含多个由逗号分隔的语句。for (int i = 0, j = 10; i < j; ++i, --j) { // ... }
10. 课后配套练习
- 计算N的阶乘: 输入一个正整数N,计算并输出 N! (N的阶乘)。
- 输出斐波那契数列: 输入一个正整数N,输出斐波那契数列的前N项。
- 打印所有偶数: 输入一个正整数N,用
for循环打印出从1到N之间所有的偶数。 - 字符串反转: 输入一个字符串,用
for循环将其反转并输出。 - 求幂运算: 输入两个整数
base和exponent,计算base的exponent次方。
点击查看答案
1. 计算N的阶乘
#include <iostream>
int main() {
int n;
std::cin >> n;
long long factorial = 1;
for (int i = 1; i <= n; ++i) {
factorial *= i;
}
std::cout << factorial << std::endl;
return 0;
}
2. 输出斐波那契数列
#include <iostream>
int main() {
int n;
std::cin >> n;
long long a = 0, b = 1;
if (n >= 1) std::cout << b << " ";
for (int i = 2; i <= n; ++i) {
long long next = a + b;
std::cout << next << " ";
a = b;
b = next;
}
std::cout << std::endl;
return 0;
}
3. 打印所有偶数
#include <iostream>
int main() {
int n;
std::cin >> n;
for (int i = 2; i <= n; i += 2) {
std::cout << i << " ";
}
std::cout << std::endl;
return 0;
}
4. 字符串反转
#include <iostream>
#include <string>
int main() {
std::string s;
std::cin >> s;
std::string reversed_s = "";
for (int i = s.length() - 1; i >= 0; --i) {
reversed_s += s[i];
}
std::cout << reversed_s << std::endl;
return 0;
}
5. 求幂运算
#include <iostream>
int main() {
int base, exponent;
std::cin >> base >> exponent;
long long result = 1;
for (int i = 0; i < exponent; ++i) {
result *= base;
}
std::cout << result << std::endl;
return 0;
}
11. 相关网络资源推荐
- cppreference.com - for loop
- OI Wiki - 循环结构
- [learncpp.com - For statements