CAPL 编程系列教程 - 第十二期:分支结构之 switch 语句

CAPL 编程系列教程的第十二期内容,主要讲解 CAPL 中分支结构的第二大类:switch 语句,也称为开关结构。

CAPL 编程系列教程 - 第十二期:分支结构之 switch 语句

一、 课程回顾与本期目标

  • 回顾: 上一期学习了 if-else 系列的分支结构。
  • 本期目标: 学习 CAPL 中的 switch 语句,理解其语法、执行流程、与 if 语句的异同,以及 casebreakdefault 关键字的作用。
  • 适用场景: switch 语句特别适用于根据一个表达式的值(通常是整数或字符)是否等于多个特定的常量值来进行分支判断的场景。

二、 switch 语句的基本语法与逻辑

  1. 基本结构:
    Code snippet
    switch (expression) { // expression 通常是整型或字符型变量/表达式
        case constant_value_1:
            // statements for case 1
            break; // 可选,但通常需要
        case constant_value_2:
            // statements for case 2
            break;
        case constant_value_3:
            // statements for case 3
            break;
        // ... 可以有更多 case
        default: // 可选
            // statements for default case
            break; // 可选
    }
    
  2. 关键字:
    • switch: 开始 switch 语句块,后面括号内是要判断的表达式。
    • case: 定义一个分支的入口点。case 后面必须跟一个常量值 (或常量表达式) 和一个冒号 :
    • break: (可选) 用于跳出整个 switch 语句块。执行完一个 case 中的语句后,遇到 break 就会结束 switch
    • default: (可选) 定义一个默认分支。当 switch 表达式的值与所有 case 后面的常量值都不匹配时,会执行 default 后面的语句。
  3. 执行逻辑:
    • 计算 switch 后面括号内 expression 的值。
    • 将该值从上到下依次与每个 case 后面的 constant_value 进行严格相等 (==) 比较。
    • 如果找到匹配的 case,则从该 case 的冒号 : 后开始执行语句。
    • 继续执行后续语句,直到遇到 break 语句,然后跳出整个 switch 块。
    • 如果没有遇到 break,程序会继续执行下一个 casedefault 中的语句,这种行为称为贯穿 (Fall-through)
    • 如果所有 case 都不匹配,且存在 default 分支,则执行 default 分支的语句。
    • 如果所有 case 都不匹配,且没有 default 分支,则 switch 语句块内什么也不执行。

三、 switch 语句的关键点与注意事项

  1. switch 表达式类型:
    • 括号 () 内的表达式的值通常应该是整数类型 (int, byte, long 等) 或字符类型 (char)
    • 虽然 CAPL 可能允许浮点数,但极其不推荐,因为它会截断小数部分再比较,行为可能不符合预期。
  2. case 标签的值:
    • case 后面必须跟常量 (如 1, 'A') 或常量表达式 (可以在编译时确定值的表达式,如 2 + 5)。
    • 不能是变量 (如 case i: 是错误的)。
    • 同一个 switch 语句中,所有 case 后面的常量值必须是唯一的,不能重复,否则编译报错 (duplicate case)。
    • case 标签的值类型必须与 switch 表达式的类型兼容(通常是整型或字符型)。
  3. break 语句的重要性:
    • 在大多数情况下,每个 case 分支的末尾都需要加上 break 语句,以防止意外的贯穿 (Fall-through) 行为,确保只执行匹配的那个 case 分支。
  4. 贯穿 (Fall-through) 的利用:
    • 省略 break 是语法允许的。
    • 当多个不同的 case 值需要执行相同的处理逻辑时,可以故意省略 break 来实现贯穿,将这些 case 标签叠在一起,共享同一段处理代码。
    • 示例 (判断工作日/休息日):
      Code snippet
      switch (weekday) {
          case 1: // 周一
          case 2: // 周二
          case 3: // 周三
          case 4: // 周四
          case 5: // 周五
              write("工作日");
              break; // 处理完工作日后跳出
          case 6: // 周六
          case 7: // 周日
              write("休息日");
              break; // 处理完休息日后跳出
          // default: // 可以选择处理无效输入
          //    write("无效的星期");
          //    break;
      }
      
      这种写法比用 if-else if 判断 weekday == 1 || weekday == 2 ... 更简洁。
  5. default 语句:
    • 可选: switch 语句可以没有 default 分支。
    • 位置: 习惯上放在最后,但语法上可以放在任何 case 之间(但不推荐,影响可读性)。
    • 作用: 处理所有未被 case 匹配的情况,可以用于错误处理或提供一个默认行为。
    • default 分支末尾的 break 通常可以省略(因为它已经是最后一个分支),但加上也无妨。

四、 switch vs if-else if

  • switch 主要用于基于单个表达式多个常量值进行相等比较的分支。代码结构通常更清晰。
  • if-else if 更通用,可以处理更复杂的条件判断,包括范围比较 (>, <)逻辑组合 (&&, ||) 以及对不同变量的判断。
  • if 语句的判断条件都是形如 variable == constant_value 时,可以考虑用 switch 替代,以提高可读性。

五、 总结与后续

  • 本期学习了 CAPL 的 switch 开关结构,它是处理多路相等条件判断的有效工具。
  • 重点掌握了 case, break, default 的用法以及贯穿行为。
  • 至此,CAPL 的主要分支结构 (ifswitch) 已讲解完毕。
  • 下一期将开始学习循环结构