我一直在想这个有一段时间了。到目前为止,我还不是一个铁杆程序员,主要是小型 Python 脚本,并且我已经编写了几个分子动力学模拟。对于真正的问题:switch 语句的意义何在?为什么不能只使用if-else 语句?
感谢您的回答,如果之前有人问过这个问题,请指向链接。
编辑
S.Lott指出这可能是If/Else vs. Switch问题的重复。如果你想关闭,那么就这样做。我将保留它以供进一步讨论。
我一直在想这个有一段时间了。到目前为止,我还不是一个铁杆程序员,主要是小型 Python 脚本,并且我已经编写了几个分子动力学模拟。对于真正的问题:switch 语句的意义何在?为什么不能只使用if-else 语句?
感谢您的回答,如果之前有人问过这个问题,请指向链接。
编辑
S.Lott指出这可能是If/Else vs. Switch问题的重复。如果你想关闭,那么就这样做。我将保留它以供进一步讨论。
switch结构更容易转换为跳转(或分支)表。当 case 标签靠近时,这可以使 switch 语句比if-else更有效。这个想法是在内存中顺序放置一堆跳转指令,然后将值添加到程序计数器中。这用加法操作替换了一系列比较指令。
下面是一些极其简化的伪组装示例。首先,if-else 版本:
// C version
if (1 == value)
function1();
else if (2 == value)
function2();
else if (3 == value)
function3();
// assembly version
compare value, 1
jump if zero label1
compare value, 2
jump if zero label2
compare value, 3
jump if zero label3
label1:
call function1
label2:
call function2
label3:
call function3
接下来是switch版本:
// C version
switch (value) {
case 1: function1(); break;
case 2: function2(); break;
case 3: function3(); break;
}
// assembly version
add program_counter, value
call function1
call function2
call function3
您可以看到生成的汇编代码更加紧凑。请注意,需要以某种方式转换该值以处理 1、2 和 3 以外的其他值。但是,这应该说明这个概念。
Switch 可以通过编译r 来优化——你会得到更快的代码。
此外,我发现它在处理可枚举类型时更加优雅。
总而言之switch语句给你性能+代码优雅:)
以下是一些有用的链接:
为了表现力,switch/case 语句允许您将多个案例组合在一起,例如:
case 1,2,3: do(this); break;
case 4,5,6: do(that); break;
为了性能,编译器有时可以将 switch 语句优化为跳转表。
我忽略了这种类型的低级优化通常不重要,并且可能因编译器而异。
我想说主要的区别是可读性。if/else 非常灵活,但是当您看到一个开关时,您会立即知道所有测试都针对同一个表达式。
除了 .NET 中提到的其他代码可读性和优化之外,您还可以打开枚举等
enum Color { Red, Green, Blue };
Color c = Color.Red;
switch (c) // Switch on the enum
{
// no casting and no need to understand what int value it is
case Color.Red: break;
case Color.Green: break;
case Color.Blue: break;
}
处理几种情况的能力(故意省略 break 语句)可能很有用,而且正如一些人已经说过的那样,它也更快。不过,也许最重要和最不重要的考虑因素是,它只会使代码比 if/else 更漂亮。:)
某些编译器可以“更好”地优化 Switch。在某些语言中使用 switch 语句存在缺陷。在 Java 中,switch 不能处理字符串,而在 VB2005 中,switch 语句不能与单选按钮一起使用。
Switch 可以更快更容易阅读,If-Then 更通用,可以在更多地方使用。
唯一可以更快的时间切换是当您的案例值是常量,不是动态的或以其他方式派生的,并且当案例的数量明显大于将哈希计算到查找表中的时间时。
以 Javascript 为例,它编译为程序集以在大多数引擎(包括 Chrome 的 V8 引擎)上执行,在常见情况下 switch 语句的执行速度要慢 30%-60%:http: //jsperf.com/switch-if -否则/20