为什么switch语句而不是if-else?

时间:2009-01-16 02:03:10

标签: if-statement language-agnostic switch-statement

我一直想知道这件事已经有一段时间了。我到目前为止还不是一个核心程序员,主要是小型Python脚本,我写了几个分子动力学模拟。对于真正的问题: 开关语句 的重点是什么?为什么你不能只使用 if-else语句

感谢您的回答,如果之前有人询问过,请指出链接。

修改

S.Lott指出这可能与问题If/Else vs. Switch重复。如果你想关闭然后这样做。我将把它留待进一步讨论。

8 个答案:

答案 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)

切换可以是optimized by compile r - 您将获得更快的代码 在处理可枚举类型时,我发现它更优雅。

总结开关语句为您提供效果 + 代码优雅:)

以下是一些有用的链接:

答案 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