62

我一直在想这个有一段时间了。到目前为止,我还不是一个铁杆程序员,主要是小型 Python 脚本,并且我已经编写了几个分子动力学模拟。对于真正的问题:switch 语句的意义何在?为什么不能只使用if-else 语句

感谢您的回答,如果之前有人问过这个问题,请指向链接。

编辑

S.Lott指出这可能是If/Else vs. Switch问题的重复。如果你想关闭,那么就这样做。我将保留它以供进一步讨论。

4

8 回答 8

91

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 以外的其他值。但是,这应该说明这个概念。

于 2009-01-16T02:15:33.993 回答
24

Switch 可以通过编译r 来优化——你会得到更快的代码。
此外,我发现它在处理可枚举类型时更加优雅。

总而言之switch语句给你性能+代码优雅:)

以下是一些有用的链接:

于 2009-01-16T02:05:19.817 回答
8

为了表现力,switch/case 语句允许您将多个案例组合在一起,例如:

case 1,2,3: do(this); break;
case 4,5,6: do(that); break;

为了性能,编译器有时可以将 switch 语句优化为跳转表。

于 2009-01-16T02:06:40.920 回答
7

我忽略了这种类型的低级优化通常不重要,并且可能因编译器而异。

我想说主要的区别是可读性。if/else 非常灵活,但是当您看到一个开关时,您会立即知道所有测试都针对同一个表达式。

于 2009-01-16T02:45:58.987 回答
4

除了 .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;

}
于 2009-01-16T02:15:25.677 回答
3

处理几种情况的能力(故意省略 break 语句)可能很有用,而且正如一些人已经说过的那样,它也更快。不过,也许最重要和最不重要的考虑因素是,它只会使代码比 if/else 更漂亮。:)

于 2009-01-16T02:15:59.717 回答
2

某些编译器可以“更好”地优化 Switch。在某些语言中使用 switch 语句存在缺陷。在 Java 中,switch 不能处理字符串,而在 VB2005 中,switch 语句不能与单选按钮一起使用。
Switch 可以更快更容易阅读,If-Then 更通用,可以在更多地方使用。

于 2009-01-16T02:10:07.433 回答
-1

唯一可以更快的时间切换是当您的案例值是常量,不是动态的或以其他方式派生的,并且当案例的数量明显大于将哈希计算到查找表中的时间时。

以 Javascript 为例,它编译为程序集以在大多数引擎(包括 Chrome 的 V8 引擎)上执行,在常见情况下 switch 语句的执行速度要慢 30%-60%:http: //jsperf.com/switch-if -否则/20

于 2013-03-29T22:15:11.743 回答