switch()使用与限制
| 类型 | 是否允许 | 典型语言 | 替代方案 |
|---|---|---|---|
| 整数 | ✅ | 所有语言 | switch |
| 浮点数 | ❌ | C/C++、Java、C# | if-else、模式匹配 |
| 字符串 | ✅(部分语言) | Java 7+、C#、JavaScript | switch、字典映射 |
| 布尔值 | ❌(多数语言) | 仅C# 允许 | if-else |
| 对象 | ❌(除特定类型) | JavaScript、Java(String) |
类型检查+if-else |
浮点数(float/double)
- 原因:浮点数存在精度问题(如
0.1 + 0.2 != 0.3),无法精确匹配。
1 | double value = 3.14; |
布尔值(bool)
- 原因:布尔值只有
true/false,直接用if-else更直观。
对象
- 原因:对象无法直接进行值匹配
1. C/C++
- 允许类型:
int、char、enum(整型或可隐式转换为整型的类型)。 - 禁止类型:浮点数、字符串、结构体、指针等。
2. Java
- 允许类型(Java 7+):
int、char、byte、short、String、enum。 - 禁止类型:浮点数、
boolean、long、对象(除String和enum外)。
性能优化:switch 通常编译为跳转表(Jump Table),需快速定位分支,仅支持离散值。
确定性匹配:浮点数精度问题和对象的引用比较会导致不确定性。
1. 使用 if-else 链
2. 字典/哈希表映射
1 | def handle_int(x): |
3. 模式匹配
1 | object value = 3.14; |
