8 for循环
正在加载视频播放器…
GESP C++ 一级:for 循环精讲
核心目标:掌握
for循环的语法、执行流程、三要素、嵌套循环、break与continue,会写累加、累乘、计数、枚举、打印图形等常见程序。
for适合次数已知的循环;初始化只做一次,条件每次判断,循环体执行后更新,再回到条件。
一、为什么用 for 循环
当一段代码需要重复执行,并且重复次数已知时,用 for 最方便。
例如:
- 求 1 到 100 的和
- 输出 1 到 n
- 求 n 的阶乘
- 打印 5 行 5 列星号
- 枚举 1 到 n 判断质数
这些场景都适合 for。
二、for 循环基本语法
for (初始化; 条件; 更新) {
循环体;
}
三要素:
| 部分 | 作用 | 示例 |
|---|---|---|
| 初始化 | 循环变量从哪开始 | int i = 1 |
| 条件 | 什么时候继续循环 | i <= n |
| 更新 | 每次循环后变量怎么变 | i++ |
示例:输出 1 到 5
for (int i = 1; i <= 5; i++) {
cout << i << " ";
}
输出:
1 2 3 4 5
三、for 循环执行流程
以 for (int i = 1; i <= 5; i++) 为例:
- 执行初始化:
int i = 1,只执行一次。 - 判断条件:
i <= 5。 - 条件为真,执行循环体。
- 执行更新:
i++。 - 回到第 2 步,再次判断条件。
- 条件为假,结束循环。
口诀:
初始化只一次;
判断条件在每次;
循环体后做更新;
条件为假就停止。
四、for 循环的常见写法
1. 从 1 到 n
for (int i = 1; i <= n; i++) {
// ...
}
2. 从 0 到 n-1
for (int i = 0; i < n; i++) {
// ...
}
3. 从 n 到 1 倒序
for (int i = n; i >= 1; i--) {
// ...
}
4. 每次增加 2
for (int i = 1; i <= n; i += 2) {
// ...
}
5. 每次乘以 2
for (int i = 1; i <= n; i *= 2) {
// ...
}
6. 循环变量在循环外声明
int i;
for (i = 1; i <= n; i++) {
// ...
}
cout << i << endl; // 循环结束后 i 仍可用
如果写成:
for (int i = 1; i <= n; i++) {
// ...
}
// cout << i; // 错误,i 只在循环内有效
一级建议:通常直接在
for里写int i = 1,简单清晰。
五、for 循环的省略写法
for 的三个部分都可以省略,但分号不能省。
1. 省略初始化
int i = 1;
for (; i <= 5; i++) {
cout << i << " ";
}
2. 省略更新
for (int i = 1; i <= 5; ) {
cout << i << " ";
i++;
}
3. 省略条件(死循环)
for (;;) {
// 需要 break 跳出
}
一级考试中建议写完整形式,避免出错。
六、for 循环常见模型
1. 求和
int sum = 0;
for (int i = 1; i <= n; i++) {
sum += i;
}
cout << sum << endl;
注意:sum 必须初始化为 0。
2. 求阶乘
long long fac = 1;
for (int i = 1; i <= n; i++) {
fac *= i;
}
cout << fac << endl;
注意:fac 必须初始化为 1。
3. 计数
int cnt = 0;
for (int i = 1; i <= n; i++) {
if (i % 3 == 0) {
cnt++;
}
}
cout << cnt << endl;
4. 求最大值
int maxv = a[0]; // 一级不考数组,可用第一个输入值
一级更常见的是边输入边比较:
int n, x;
cin >> n;
int maxv = -1000000000;
for (int i = 1; i <= n; i++) {
cin >> x;
if (x > maxv) maxv = x;
}
cout << maxv << endl;
5. 判断质数
bool isPrime = true;
if (n < 2) isPrime = false;
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
isPrime = false;
break;
}
}
if (isPrime) cout << "质数";
else cout << "不是质数";
6. 枚举所有可能
for (int i = 1; i <= 100; i++) {
if (i % 3 == 0 && i % 5 == 0) {
cout << i << " ";
}
}
7. 打印图形
打印 3 行 4 列星号:
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 4; j++) {
cout << "*";
}
cout << endl;
}
输出:
****
****
****
打印直角三角形:
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
cout << "*";
}
cout << endl;
}
8. 九九乘法表
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
cout << j << "*" << i << "=" << i * j << " ";
}
cout << endl;
}
七、嵌套 for 循环
1. 基本形式
for (初始化1; 条件1; 更新1) {
for (初始化2; 条件2; 更新2) {
循环体;
}
}
执行流程:
- 外层循环走一步,内层循环跑一圈。
- 外层执行一次,内层完整执行一遍。
2. 示例:输出坐标
for (int i = 1; i <= 2; i++) {
for (int j = 1; j <= 3; j++) {
cout << i << j << " ";
}
cout << endl;
}
输出:
11 12 13
21 22 23
3. 嵌套循环易错点
- 内层循环变量不能和外层同名。
- 内层循环变量要在内层初始化。
- 内层
break只跳出内层循环,不影响外层。 - 换行
cout << endl;应放在内层循环结束后、外层循环内。
八、break 与 continue
1. break
立即跳出整个循环。
for (int i = 1; i <= 10; i++) {
if (i == 5) break;
cout << i << " ";
}
输出:
1 2 3 4
2. continue
跳过本次循环剩余语句,进入下一次循环。
for (int i = 1; i <= 5; i++) {
if (i == 3) continue;
cout << i << " ";
}
输出:
1 2 4 5
3. 对比
| 语句 | 作用 |
|---|---|
break |
跳出整个循环 |
continue |
跳过本次,继续下一次 |
九、for 与 while 的对比
| 项目 | for |
while |
|---|---|---|
| 适合场景 | 次数已知 | 次数未知,条件驱动 |
| 三要素位置 | 集中在括号内 | 分散在循环内外 |
| 最少执行次数 | 0 次 | |
| 示例 | for (int i = 1; i <= n; i++) |
while (n > 0) |
| 可读性 | 次数已知时更清晰 | 条件驱动时更自然 |
互相转换示例:
for 版:
int sum = 0;
for (int i = 1; i <= n; i++) {
sum += i;
}
while 版:
int i = 1, sum = 0;
while (i <= n) {
sum += i;
i++;
}
十、易错点
-
for括号内用逗号分隔for (int i = 1, i <= n, i++) // 错误 for (int i = 1; i <= n; i++) // 正确 -
忘记写分号
for (int i = 1; i <= n i++) // 错误 -
条件后多写分号
for (int i = 1; i <= n; i++); // 错误,循环体为空 -
循环变量未初始化
for (; i <= n; i++) // 如果 i 之前没定义,错误 -
循环变量未更新
for (int i = 1; i <= n; ) { cout << i; // 忘记 i++,死循环 } -
循环边界错误
for (int i = 1; i < n; i++) // 少一次 for (int i = 1; i <= n; i++) // 正确 -
累加变量未初始化
int sum; for (...) sum += i; // 错误 int sum = 0; // 正确 -
累乘变量初始化为 0
long long fac = 0; // 错误 long long fac = 1; // 正确 -
在循环内重复初始化累加变量
for (int i = 1; i <= n; i++) { int sum = 0; // 错误,每次循环都清零 sum += i; } -
嵌套循环变量同名
for (int i = 1; i <= 3; i++) { for (int i = 1; i <= 4; i++) { // 错误 } } -
break和continue混淆break:整个循环结束。continue:只跳过本次。
-
输出格式错误
注意空格、换行,按题目要求输出。
十一、阅读程序写结果
题目 1
for (int i = 1; i <= 4; i++) {
cout << i << " ";
}
输出:
1 2 3 4
题目 2
for (int i = 5; i >= 1; i--) {
cout << i << " ";
}
输出:
5 4 3 2 1
题目 3
int sum = 0;
for (int i = 1; i <= 5; i++) {
sum += i;
}
cout << sum << endl;
输出:
15
题目 4
long long fac = 1;
for (int i = 1; i <= 5; i++) {
fac *= i;
}
cout << fac << endl;
输出:
120
题目 5
for (int i = 1; i <= 5; i++) {
if (i == 3) continue;
cout << i << " ";
}
输出:
1 2 4 5
题目 6
for (int i = 1; i <= 5; i++) {
if (i == 3) break;
cout << i << " ";
}
输出:
1 2
题目 7
for (int i = 1; i <= 2; i++) {
for (int j = 1; j <= 3; j++) {
cout << "*";
}
cout << endl;
}
输出:
***
***
题目 8
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= i; j++) {
cout << "*";
}
cout << endl;
}
输出:
*
**
***
题目 9
int cnt = 0;
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) cnt++;
}
cout << cnt << endl;
输出:
5
题目 10
for (int i = 1; i <= 10; i += 3) {
cout << i << " ";
}
输出:
1 4 7 10
十二、速查表
| 需求 | 写法 |
|---|---|
| 从 1 到 n | for (int i = 1; i <= n; i++) |
| 从 0 到 n-1 | for (int i = 0; i < n; i++) |
| 从 n 到 1 | for (int i = n; i >= 1; i--) |
| 每次加 2 | for (int i = 1; i <= n; i += 2) |
| 每次乘 2 | for (int i = 1; i <= n; i *= 2) |
| 求和 | sum = 0; for (...) sum += i; |
| 求阶乘 | fac = 1; for (...) fac *= i; |
| 计数 | cnt = 0; for (...) if (条件) cnt++; |
| 嵌套循环 | for (...) { for (...) { ... } } |
| 跳出循环 | break |
| 跳过本次 | continue |
| 死循环 | for (;;) { ... break; } |
十三、总结
for 循环是一级考试中最重要的循环结构。
for适合次数已知的循环。- 三要素:初始化、条件、更新,用分号分隔。
- 初始化只执行一次,条件每次判断,更新在循环体后执行。
- 循环变量通常写在
for内部,作用域只在循环内。 - 累加变量初始化为 0,累乘变量初始化为 1。
- 嵌套循环中外层走一步,内层跑一圈。
break跳出整个循环,continue跳过本次。- 注意循环边界:
i < n和i <= n结果不同。
复习时多练“阅读程序写结果”“求和求积”“打印图形”“嵌套循环”四类题,重点注意分号、边界、初始化、更新、花括号和输出格式。考试中先确定循环次数,再确定循环变量从哪开始、到哪结束、每次怎么变,最后逐行模拟。