奇思妙想 · 2024年 5月 2日 0

case语句可以动态筛选?

63 次浏览

传统意义上,C/ObjC/C++不支持case匹配的动态筛选,只有静态且具体值对应匹配。

  • Swift提供了case <pattern> 可以动态筛选条件,比较灵活强大。技术上并不复杂,只是将之前的单一静态条件判断变成<pattern>条件判断语句。
  • C++17允许switch初始化表达式(switch 语句 (C++) | Microsoft Learn),但case依然局限于具体值范围,不能加入变量条件。
    GNU扩展对C/C++都允许case范围匹配,例如如下case 1 ... 10,但MSVC不支持。
    switch (int x = value; x) { // Only C++17 works
    case 1 ... 10:
    // GNU C/C++ both works
    }
    - 此处需特别注意,case 1...10会编译出错,"..."前后必须有空格(Case Ranges | GCC).
    - 可能会发现用gcc -std=c89或g++ -std=c++98都可以编译过如上case 1 ... 10,不要惊慌,可能你使用的GCC版本default就启用case范围匹配,哪怕指定用标准C语言或者C++也不能阻挡GCC对范围匹配的支持。
  • C# 7.0 引入的模式匹配(Pattern Matching)允许开发者在 switch 语句中使用更复杂的条件来匹配不同的情况,不止基于常量值,还能基于数据类型、属性、条件关系等进行分支,因为太灵活了,此处不举例了。
  • Java 12对switch表达式进行优化,允许多值并带有条件判断。
  • JavaScript case允许任意表达式,且case表达式是运行时求值而非C/C++编译期求值,所以JS的case表达式性能会低很多。
  • Kotlin 用when语句支持传统语言的switch/case,也支持范围匹配和表达式作为条件判断。