C++ for 循环进阶
中等26玩转 for 循环进阶版:三招让你的循环更灵活
你有没有遇到过这样的情况:写循环时想同时控制两个变量,或者想让循环的更新步骤不那么死板?别急,for 循环其实是“可定制”的!就像搭积木一样,它的三个部分——初始化、条件判断、更新——都可以按你的需要调整。今天我们就来学三招,让 for 循环变成你手下的“变形金刚”。
第一招:一次管多个变量——操场两边的报数
想象一下,你在操场上喊口令:“左边的队伍从1开始正着报数,右边的队伍从10开始倒着报数,两个人同时喊!”用标准 for 循环只能管一个变量,而进阶版可以一次“握住”两个变量,同时变化。
生活例子:老师让你统计全班同学从矮到高和从高到矮的序号对比。矮个子第1名对应高个子第10名,矮个子第2名对应高个子第9名……用两个变量 i 和 j 同步移动,就能轻松打印出配对表。
// 打印配对:i从1递增,j从10递减
for (int i = 1, j = 10; i <= 5; i++, j--) {
cout << "第" << i << "矮——第" << j << "高" << endl;
}
输出效果:
第1矮——第10高
第2矮——第9高
第3矮——第8高
第4矮——第7高
第5矮——第6高
注意:多个变量之间用逗号隔开,初始化和更新部分都可以写多个语句,但记得用逗号连接(而不是分号)。条件部分只能写一个逻辑表达式,但你可以用 && 或 || 组合多个条件。
第二招:省略“零件”——让循环更自由
for 循环的三个部分可以任意省略,但省略时要清楚可能导致什么后果。
1. 省略更新部分:把更新“藏”在循环体里
有时候更新步骤不规律,比如只打印奇数,每次都加2。这时可以把更新写在循环体内部,让 for 循环只负责初始化+条件判断。
// 打印1到10之间的奇数
for (int i = 1; i <= 10; ) { // 注意这里没有更新语句
cout << i << " ";
i += 2; // 手动更新,每次加2
}
2. 省略初始化部分:变量已经在循环外面定义
比如你提前定义好了计数器,就可以在 for 里只写条件+更新。
int i = 0; // 初始化放在循环外
for ( ; i < 5; i++ ) { // 第一个分号前面空白
cout << i << " ";
}
3. 省略条件部分——小心变成“死循环”!
如果你不小心漏掉了条件,循环永远不结束,除非你在循环体里用 break 主动退出。
// 故意省略条件,用 break 控制退出
int i = 0;
for ( ; ; i++) { // 条件为空,等价于永远真
if (i >= 5) break; // 达到条件强制退出
cout << i << " ";
}
常见错误:初学者容易忘记写更新语句,又忘了写条件,程序就会一直运行直到卡死。比如:
// 错误代码:忘记更新 i,条件永远成立!
int i = 0;
for ( ; i < 5; ) { // 条件一直为真,因为 i 永远等于0
cout << "死循环!";
}
正确做法:要么在 for 的第三个部分写更新,要么在循环体里写更新,二者至少有一个。
第三招:用逗号运算符把多个更新塞在一起
逗号运算符(,)可以在一行里写多个表达式,表达式的值取最后一个。在 for 循环的更新部分,我们可以用逗号把多个变量的变化写在一起,看起来更紧凑。
生活例子:小明和小红从同一起点往相反方向走,小明每秒向右走1步,小红每秒向左走2步。想知道5秒后他们相距多远?可以用两个变量分别记录位置,每轮同时更新。
// 小明位置a(向右+1),小红位置b(向左-2)
for (int a = 0, b = 0; a <= 5; a++, b -= 2) {
cout << "第" << a << "秒:小明在" << a << ",小红在" << b << ",距离" << (a - b) << endl;
}
输出:
第0秒:小明在0,小红在0,距离0
第1秒:小明在1,小红在-2,距离3
第2秒:小明在2,小红在-4,距离6
...
小技巧:逗号运算符也可以用在初始化部分,比如定义多个变量 int i = 0, j = 0; 实际上就是用了逗号。
常见错误与调试小贴士
- 死循环:忘记更新条件,或者条件写反(比如
i <= 10写成i >= 10)。- ?️ 快速检查:在循环体第一行加
cout << i << endl;看它是否变化。
- ?️ 快速检查:在循环体第一行加
- 多个变量更新顺序:逗号连接的多个表达式按从左到右执行,如果后面变量用到前面变量的新值,要小心顺序。
- 例如
a++, b = a*2:先把 a 加 1,再把新 a 乘 2 赋给 b。
- 例如
- 忘记花括号:如果循环体有多条语句,必须用
{ }括起来,否则只有第一条属于循环体。 - 条件中变量写错:比如用
i < j却忘记更新其中一个变量,导致逻辑错误。
完整示例:同时统计奇数和与偶数和
假设你想用一次循环同时算出1到100之间所有奇数的和以及偶数的和。我们可以用两个变量 sumOdd 和 sumEven,再配合一个变量 i 从1到100遍历,每次判断奇偶性分别累加。
#include <iostream>
using namespace std;
int main() {
int sumOdd = 0; // 奇数总和
int sumEven = 0; // 偶数总和
for (int i = 1; i <= 100; i++) { // 从1到100循环
if (i % 2 == 0) { // 偶数
sumEven += i;
} else { // 奇数
sumOdd += i;
}
}
cout << "奇数和 = " << sumOdd << endl;
cout << "偶数和 = " << sumEven << endl;
return 0;
}
运行结果:
奇数和 = 2500
偶数和 = 2550
你也可以用上一招“多变量”改写成更高效的方式:用两个循环变量同时遍历奇数和偶数,但这里演示的是最常见的做法。
更多相关知识点
- while 循环:当你不清楚循环次数时,while 更灵活。
- break 与 continue:可以在循环中提前跳出或跳过某次迭代。
- 嵌套循环:在循环里面再套循环,比如打印九九乘法表。
- 循环的性能:多个变量同时更新并不会降低效率,反而能让代码更清晰。
如果你已经掌握了这些技巧,下次遇到“按步长变化”、“同时处理两个序列”等问题时,就能轻松写出简洁又强大的 for 循环啦!
例题精讲
执行以下for循环后,变量x的值是多少? int x = 0; for(int i = 0, j = 5; i < j; i++, j--) { x++; }
在C++中,for循环内使用break语句会立即终止整个循环,而continue语句会跳过当前循环体剩余部分,开始下一次迭代。
以下代码使用嵌套for循环打印乘法表的下三角部分,请填空。
#include <iostream>
using namespace std;
int main() {
for(int i = 1; i <= 9; i++) {
for(int j = 1; ___; j++) {
cout << i << "*" << j << "=" << i*j << "\t";
}
cout << endl;
}
return 0;
}关于C++11中的范围for循环(range-based for),以下哪项描述是正确的?
使用范围for循环计算数组arr中所有元素的和。
int arr[] = {10, 20, 30, 40, 50};
int sum = 0;
for(___ : arr) {
sum += x;
}