C++ for 循环(完整指南)

C++ for 循环入门:从零开始掌握循环控制

在编程的世界里,重复是常态。无论是处理数组中的每一个元素,还是执行某个操作 100 次,我们都需要一种机制来避免手动写 100 行完全相同的代码。C++ 中的 for 循环,正是解决这类问题的“得力助手”。它结构清晰、控制精准,是 C++ 编程中最常用、最核心的循环结构之一。如果你刚开始学习 C++,那么掌握 for 循环,就是迈向高效编程的第一步。

想象一下,你正在整理一个班级的学生成绩表,有 30 个学生。如果每个学生都要单独打印一次成绩,你会怎么写?写 30 次 cout << student1_score;?显然不现实。而 for 循环,就像一个自动化的流水线,让你只需定义“从第一个人开始,一直做到最后一个人”,剩下的工作它会帮你完成。

C++ for 循环的基本语法结构

C++ for 循环的语法非常规范,由三个部分组成,用分号隔开:

for (初始化语句; 条件判断; 迭代语句)
{
    // 循环体代码
}

我们来逐部分拆解:

  • 初始化语句:在循环开始前执行一次,通常用于定义循环变量,比如 int i = 0
  • 条件判断:每次循环开始前都会检查这个条件。如果为 true,执行循环体;如果为 false,循环结束。
  • 迭代语句:在每次循环体执行完毕后运行,通常用于更新循环变量,比如 i++

举个例子,打印数字 1 到 5:

#include <iostream>
using namespace std;

int main()
{
    // 初始化:i 从 1 开始
    // 条件:i 小于等于 5 时继续循环
    // 迭代:每次循环后 i 增加 1
    for (int i = 1; i <= 5; i++)
    {
        cout << i << " ";  // 输出当前数字,后面加空格
    }
    cout << endl;  // 换行,让输出更清晰
    return 0;
}

输出结果为:1 2 3 4 5

💡 小贴士:for 循环的三部分都可以省略,但分号不能省。例如 for(;;) 是一个无限循环,常用于服务器程序中,但初学者需谨慎使用。

循环变量的作用域与生命周期

在 for 循环中,我们经常用 int i 作为循环变量。这个变量的生命周期是怎样的?它在循环结束后还能用吗?

来看下面这个例子:

#include <iostream>
using namespace std;

int main()
{
    for (int i = 0; i < 3; i++)
    {
        cout << "第 " << i + 1 << " 次循环" << endl;
    }

    // 尝试在这里使用 i
    // cout << i;  // 编译错误!i 已超出作用域

    return 0;
}

注意:i 是在 for 循环的括号内定义的,它的作用域仅限于 for 循环体内部。一旦循环结束,i 就被销毁了。这种设计有助于避免变量名冲突,是 C++ 的良好实践。

但如果需要在循环外部使用循环变量,应该在循环前声明:

int i;  // 提前声明
for (i = 0; i < 3; i++)
{
    cout << "第 " << i + 1 << " 次循环" << endl;
}
cout << "循环结束后 i 的值是 " << i << endl;  // 正常输出:3

这样 i 就可以在循环外部使用了。

实际应用:遍历数组与字符串

C++ for 循环最经典的用途之一,就是遍历数组和字符串。我们以一个整型数组为例:

#include <iostream>
using namespace std;

int main()
{
    int scores[] = {88, 92, 76, 95, 83};  // 存储 5 个学生的成绩
    int size = 5;  // 数组大小

    // 使用 for 循环遍历数组
    for (int i = 0; i < size; i++)
    {
        cout << "第 " << (i + 1) << " 个学生的成绩是 " << scores[i] << endl;
    }

    return 0;
}

输出结果:

第 1 个学生的成绩是 88
第 2 个学生的成绩是 92
第 3 个学生的成绩是 76
第 4 个学生的成绩是 95
第 5 个学生的成绩是 83

这里的关键是 i 从 0 开始,到 size - 1 结束。因为数组下标从 0 开始,所以 i < size 是正确的边界条件。

对于字符串,C++ 中的 std::string 也支持类似遍历:

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string name = "Alice";

    // 遍历字符串中的每一个字符
    for (int i = 0; i < name.length(); i++)
    {
        cout << "第 " << (i + 1) << " 个字符是 '" << name[i] << "'" << endl;
    }

    return 0;
}

输出:

第 1 个字符是 'A'
第 2 个字符是 'l'
第 3 个字符是 'i'
第 4 个字符是 'c'
第 5 个字符是 'e'

✅ 重要提示:name.length() 返回字符串长度,不要误写成 name.size()(虽然功能一样,但 length() 更直观)。

常见错误与调试技巧

初学者在使用 C++ for 循环时,常常遇到以下问题:

1. 下标越界(Off-by-one Error)

这是最常见的错误。比如想打印 1 到 5,却写成了 i <= 5,虽然这次没出错,但如果数组大小是 5,循环写成 i <= 5 就会访问 scores[5],超出数组范围,导致程序崩溃。

✅ 正确做法:i < size,不要写 <=

2. 条件判断写错

比如想从 10 递减到 1,却写成 i-- 时忘记初始值:

for (int i = 10; i >= 1; i--)  // 正确
{
    cout << i << " ";
}

如果写成 i++,就会陷入无限循环。

3. 分号误加

for (int i = 0; i < 5; i++);  // 错误:分号直接结束循环!
{
    cout << "这行不会执行" << endl;
}

这个循环体为空,cout 语句已经不属于循环,不会被执行。所以一定要注意分号位置。

进阶用法:嵌套循环与优化建议

当需要处理二维数组(如矩阵)时,嵌套 for 循环就派上用场了:

#include <iostream>
using namespace std;

int main()
{
    int matrix[2][3] = {
        {1, 2, 3},
        {4, 5, 6}
    };

    // 外层循环遍历行
    for (int i = 0; i < 2; i++)
    {
        // 内层循环遍历列
        for (int j = 0; j < 3; j++)
        {
            cout << "matrix[" << i << "][" << j << "] = " << matrix[i][j] << "  ";
        }
        cout << endl;  // 每行结束后换行
    }

    return 0;
}

输出:

matrix[0][0] = 1  matrix[0][1] = 2  matrix[0][2] = 3  
matrix[1][0] = 4  matrix[1][1] = 5  matrix[1][2] = 6  

在嵌套循环中,外层循环每执行一次,内层循环就完整执行一轮。

性能小贴士:

  • 避免在循环条件中调用耗时函数,比如 vector.size()。如果大小不变,建议提前保存:
int n = scores.size();  // 提前获取大小
for (int i = 0; i < n; i++)  // 使用 n,而不是每次调用 size()
{
    // ...
}
  • 如果循环体只执行一次,考虑是否真的需要循环。

总结:C++ for 循环的核心价值

C++ for 循环不仅是一种语法结构,更是一种编程思维的体现:将重复的逻辑交给机器,人类只需定义规则。从打印数字、遍历数组,到处理多维数据,for 循环几乎无处不在。

掌握它的三个组成部分,理解变量作用域,避免常见错误,你就能写出安全、高效、可读性强的代码。无论你是初学者还是中级开发者,深入理解 C++ for 循环,都将为你的编程之路打下坚实基础。

记住,编程不是死记硬背,而是不断练习与反思的过程。从今天开始,多写几段 for 循环代码,哪怕只是打印 1 到 10,也能让你离高手更近一步。