类型 是否允许 典型语言 替代方案
整数 所有语言 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
2
3
4
double value = 3.14;
switch (value) { // 编译错误:表达式类型必须为整型或枚举
case 3.14:"输出错误"
}

布尔值(bool

  • 原因:布尔值只有 true/false,直接用 if-else 更直观。

对象

  • 原因:对象无法直接进行值匹配

1. C/C++

  • 允许类型intcharenum(整型或可隐式转换为整型的类型)。
  • 禁止类型:浮点数、字符串、结构体、指针等。

2. Java

  • 允许类型(Java 7+):intcharbyteshortStringenum
  • 禁止类型:浮点数、booleanlong、对象(除Stringenum外)。

性能优化switch 通常编译为跳转表(Jump Table),需快速定位分支,仅支持离散值。

确定性匹配:浮点数精度问题和对象的引用比较会导致不确定性。

1. 使用 if-else

2. 字典/哈希表映射

1
2
3
4
5
6
7
8
9
10
11
12
13
def handle_int(x):
return "整数"

def handle_float(x):
return "浮点数"

handlers = {
int: handle_int,
float: handle_float
}

value = 3.14
print(handlers[type(value)](value)) # 输出 "浮点数"

3. 模式匹配

1
2
3
4
5
6
object value = 3.14;
switch (value) {
case double d when d == 3.14:
Console.WriteLine("Matched!");
break;
}