CAPL 编程系列教程 - 第十四期:循环结构 (第二部分) - for 循环

CAPL 编程系列教程的第十四期内容,主要讲解 CAPL 中的另一种重要的循环结构:for 循环语句

CAPL 编程系列教程 - 第十四期:循环结构 (第二部分) - for 循环

一、 课程回顾与本期目标

  • 回顾: 上一期学习了 whiledo-while 循环结构。
  • 本期目标: 学习 CAPL 中最常用的循环结构 for 语句,理解其语法、执行流程、与 while 循环的对比以及一些特殊用法。注:CAPL 语言的 for 循环不支持逗号运算符

二、 for 循环语句的语法与执行流程

  1. 基本语法:
    Code snippet
    for (initialization; condition; update) {
        // Loop body statements
    }
    
  • 关键字: for
  • 括号内的三部分 (用分号 ; 分隔):
    • initialization (初始化):
      • 在循环第一次开始之前执行,且仅执行一次
      • 通常用于声明并/或初始化循环控制变量(如 int i = 0;i = 0;)。
    • condition (条件):
      • 每次循环迭代开始之前进行判断。
      • 决定是否执行或继续执行循环体。
      • 求值规则同 if/while非零即真
    • update (更新):
      • 每次循环体执行之后,下一次条件判断之前执行。
      • 通常用于修改循环控制变量的值(如 i++, i += 2, j--)。
  • 循环体 (Loop Body):
    • 花括号 {} 内的语句块。
    • condition 为真时执行。
    • 如果只有一条语句,花括号可省略(但不推荐)。
  • 执行顺序:
    • ① 执行 initialization (仅一次)。
    • ② 判断 condition
    • ③ 如果 condition 为真,执行循环体 (Loop Body)。
    • ④ 执行 update
    • ⑤ 返回步骤 ②,重复判断 condition
    • ⑥ 如果 condition 为假,循环结束,跳出 for 循环,执行后续语句。

三、 for 循环示例

  1. 打印三次 "I love you":
    Code snippet
    int i; // 可以在循环外声明
    for (i = 0; i < 3; i++) { // 初始化; 条件; 更新
        write("I love you %d", i); // 输出 0, 1, 2
    }
    
  2. 计算 1 到 100 的和:
    Code snippet
    int i;
    int total = 0;
    for (i = 1; i <= 100; i++) {
        total += i; // 循环体
    }
    write("总和为: %d", total); // 输出 5050
    
  • 简洁性: 相对于 while 循环,for 循环将初始化、条件判断和更新这三个与循环控制密切相关的部分集中写在了一起,结构更紧凑,代码通常更简洁易读,特别适用于循环次数已知或有明确范围的情况。

四、 for 循环的灵活性与特殊用法

  1. 省略括号中的部分: for 循环括号内的三个部分(初始化、条件、更新)都可以省略,但分号 ; 必须保留
    • 省略初始化: 如果循环变量在 for 之前已经初始化,可以省略第一部分。
      Code snippet
      int i = 1;
      int total = 0;
      for (; i <= 100; i++) { // 省略初始化
          total += i;
      }
      
    • 省略更新: 如果更新逻辑放在循环体内,可以省略第三部分。
      Code snippet
      int i = 1;
      int total = 0;
      for (; i <= 100; ) { // 省略更新
          total += i;
          i++; // 在循环体内更新
      }
      
    • 省略条件:
      • 如果省略条件部分,条件永远被视为真 (True)
      • 这会创建一个无限循环 (死循环),除非在循环体内使用 break 或其他方式(如 return, exit)跳出。
      • 示例 (需配合 break):
        Code snippet
        int i = 1;
        int total = 0;
        for (;;){ // 无限循环
            total += i;
            if (i == 100) { // 在循环体内判断退出条件
                break; // 达到条件后跳出
            }
            i++;
        }
        
        (虽然语法允许,但不推荐这样写,不如直接把条件写在 for 的第二部分清晰)。
    • 全部省略: for (;;) 是一个标准的无限循环写法,依赖循环体内的 break 退出。
  2. 循环主体省略花括号: 当循环体只有一条语句时,可以省略花括号 {},但不推荐。
    Code snippet
    for (i = 1; i <= 100; i++)
        total += i; // 只有这一句是循环体
    
  3. 循环控制关键字:
    • break: 同样可以在 for 循环体中使用,用于立即跳出整个 for 循环。
    • continue: 同样可以在 for 循环体中使用,用于跳过当前迭代中 continue 之后的语句,直接进入 update 部分,然后进行下一次条件判断。
    • 示例 (判断质数): 使用 for 循环重写判断质数的逻辑,利用 break 提前退出。
      Code snippet
      int number = 121;
      int i;
      for (i = 2; i < number; i++) { // i 从 2 循环到 number-1
          if (number % i == 0) {
              write("%d 不是质数, 能被 %d 整除", number, i);
              break; // 找到因子,退出 for 循环
          }
      }
      if (i == number) { // 判断循环是 break 退出还是正常结束
          write("%d 是质数", number);
      }
      

五、 CAPL for 循环与 C 语言 for 循环的区别

  • 逗号运算符:
    • C 语言的 for 循环支持在初始化部分和更新部分使用逗号运算符 , 来执行多个表达式(例如,同时初始化或更新多个变量:for (i=1, j=5; i<=5; i++, j--))。
    • CAPL 语言的 for 循环不支持逗号运算符。在初始化和更新部分,只能包含单个表达式
  • 解决方法: 如果需要在 CAPL 的 for 循环中实现类似 C 语言逗号运算符的效果(如同时更新多个变量),需要将额外的更新操作移到循环体内部去完成。
    Code snippet
    // CAPL 实现类似 C 的 for (i=1, j=5; i<=5; i++, j--)
    int i, j = 5; // j 需要在循环外初始化
    for (i = 1; i <= 5; i++) {
        write("%d + %d = %d", i, j, i + j);
        j--; // 在循环体内更新 j
    }
    

六、 总结与后续

  • 本期学习了 CAPL 中常用的 for 循环结构,它将循环控制的三个关键部分(初始化、条件、更新)集中管理,通常比 while 更简洁。
  • 掌握了 for 循环的执行流程、省略用法、break/continue 的应用,并特别注意了其与 C 语言在逗号运算符上的区别。
  • 至此,CAPL 的主要循环结构 (while, do-while, for) 已讲解完毕。后续将学习 CAPL 的其他高级特性。