信奥崔老师:循环语句-for 语句

112 阅读4分钟

3. 循环语句

循环语句允许程序重复执行一段代码,直到满足某个退出条件。这是处理重复性任务、遍历数据集和实现许多算法的基础。

3.1 for 语句

图片

1. 概念介绍

for 语句是C++中最常用的循环结构,特别适用于循环次数已知循环变量有规律变化的情况。它将循环的初始化、条件判断和更新操作集中在一条语句中,结构清晰,易于阅读。

其基本结构为:for (initialization; condition; update) { // loop body }

  • initialization:  初始化语句,在循环开始前仅执行一次。通常用于声明和初始化循环控制变量。
  • condition:  条件表达式,在每次循环迭代开始前进行判断。如果为真,则执行循环体;如果为假,则退出循环。
  • update:  更新语句,在每次循环体执行完毕后执行。通常用于修改循环控制变量,使其最终能使条件为假。

2. 算法步骤

  1. 执行 initialization 语句。
  2. 判断 condition 表达式的真假。
  3. 如果 condition 为 false,循环结束,程序跳转到 for 循环之后的代码。
  4. 如果 condition 为 true,则执行循环体内的代码。
  5. 执行 update 语句。
  6. 返回第 2 步,继续判断 condition

3. 算法可视化SVG图示

图片

4. 核心特性

  • 结构紧凑:  将循环控制的三个关键部分放在一行,代码清晰。
  • 作用域:  在 initialization 中声明的变量,其作用域仅限于该 for 循环内部(包括条件和更新部分)。
  • 灵活性: initializationconditionupdate 三个部分都是可选的,可以省略。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 = {12345};
    for (int num : nums) {
        std::cout << num << " ";
    }
    
  • 多变量控制: for 循环的初始化和更新部分可以包含多个由逗号分隔的语句。

    for (int i0, j = 10; i < j; ++i, --j) {
        // ...
    }
    

10. 课后配套练习

  1. 计算N的阶乘:  输入一个正整数N,计算并输出 N! (N的阶乘)。
  2. 输出斐波那契数列:  输入一个正整数N,输出斐波那契数列的前N项。
  3. 打印所有偶数:  输入一个正整数N,用 for 循环打印出从1到N之间所有的偶数。
  4. 字符串反转:  输入一个字符串,用 for 循环将其反转并输出。
  5. 求幂运算:  输入两个整数 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 >= 1std::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