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; |