传统意义上,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,也支持范围匹配和表达式作为条件判断。
