CC++ & Algorithm

C++ for 循环进阶

中等26
语言版本:C++Python
概述:学会用for循环的多种写法,让代码更灵活、更强大。

玩转 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; 实际上就是用了逗号。


常见错误与调试小贴士

  1. 死循环:忘记更新条件,或者条件写反(比如 i <= 10 写成 i >= 10)。
    • ?️ 快速检查:在循环体第一行加 cout << i << endl; 看它是否变化。
  2. 多个变量更新顺序:逗号连接的多个表达式按从左到右执行,如果后面变量用到前面变量的新值,要小心顺序。
    • 例如 a++, b = a*2:先把 a 加 1,再把新 a 乘 2 赋给 b。
  3. 忘记花括号:如果循环体有多条语句,必须用 { } 括起来,否则只有第一条属于循环体。
  4. 条件中变量写错:比如用 i < j 却忘记更新其中一个变量,导致逻辑错误。

完整示例:同时统计奇数和与偶数和

假设你想用一次循环同时算出1到100之间所有奇数的和以及偶数的和。我们可以用两个变量 sumOddsumEven,再配合一个变量 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 循环啦!

例题精讲

1单选题

执行以下for循环后,变量x的值是多少? int x = 0; for(int i = 0, j = 5; i < j; i++, j--) { x++; }

A0
B1
C2
D3
2判断题

在C++中,for循环内使用break语句会立即终止整个循环,而continue语句会跳过当前循环体剩余部分,开始下一次迭代。

3填空题
以下代码使用嵌套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;
}
4单选题

关于C++11中的范围for循环(range-based for),以下哪项描述是正确的?

A可以修改容器中的元素(当使用拷贝时)
B不能使用break语句提前退出循环
C自动遍历容器或数组的每一个元素,无需手动索引
D只适用于数组,不适用于标准容器
5填空题
使用范围for循环计算数组arr中所有元素的和。
int arr[] = {10, 20, 30, 40, 50};
int sum = 0;
for(___ : arr) {
    sum += x;
}