我一直想知道这件事已经有一段时间了。我到目前为止还不是一个核心程序员,主要是小型Python脚本,我写了几个分子动力学模拟。对于真正的问题: 开关语句 的重点是什么?为什么你不能只使用 if-else语句 ?
感谢您的回答,如果之前有人询问过,请指出链接。
修改
S.Lott指出这可能与问题If/Else vs. Switch重复。如果你想关闭然后这样做。我将把它留待进一步讨论。
答案 0 :(得分:87)
开关构造更容易转换为jump (or branch) table。当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
接下来是交换机版本:
// 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之外的其他值。但是,这应该说明这一概念。
答案 1 :(得分:22)
答案 2 :(得分:6)
为表达性,switch / case语句允许您将多个案例组合在一起,例如:
case 1,2,3: do(this); break;
case 4,5,6: do(that); break;
为了提高性能,编译器有时可以将switch语句优化为跳转表。
答案 3 :(得分:6)
我忽略了这种低级优化通常不重要,可能与编译器不同。
我认为主要区别在于可读性。 if / else非常灵活,但当你看到一个开关时,你立即知道所有的测试都是针对同一个表达的。
答案 4 :(得分:3)
除了.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;
}
答案 5 :(得分:2)
通过几个案例(故意遗漏休息陈述)的能力可能是有用的,并且正如一些人已经说过它也更快。也许最重要也是最不重要的考虑因素是,它只是制作比if / else更漂亮的代码。 :)
答案 6 :(得分:1)
某些编译器可以优化“更好”的开关。在某些语言中使用switch语句存在缺陷。在Java中,交换机无法处理字符串,在VB2005中,switch语句不适用于单选按钮 Switch可以更快,更容易阅读,If-Then更通用,可以在更多地方使用。
答案 7 :(得分:-1)
唯一的时间切换可以更快,例如,当您的案例值是常量,而不是动态或以其他方式派生时,以及案例数明显大于计算哈希到查找表中的时间。
在大多数引擎(包括Chrome的V8引擎)上编译执行程序集的Javascript的一个例子是,在常见情况下执行开关语句的速度要慢30%-60%:http://jsperf.com/switch-if-else/20