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

Nop*_*ope 60 language-agnostic if-statement switch-statement

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

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

编辑

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

Jud*_*den 88

开关构建体更容易地转换成一个跳跃(或分支)表.当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
Run Code Online (Sandbox Code Playgroud)

接下来是交换机版本:

    // 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
Run Code Online (Sandbox Code Playgroud)

您可以看到生成的汇编代码更紧凑.请注意,需要以某种方式转换该值以处理除1,2和3之外的其他值.但是,这应该说明这个概念.

  • 很公平,我想保持简单.另外,我相信C switch语句早于分支预测,他想知道它存在的原因...... (2认同)

aku*_*aku 23

可以通过编译 r 来优化开关- 您将获得更快的代码.
在处理可枚举类型时,我发现它更优雅.

总结一下switch语句给你性能 + 代码优雅 :)

以下是一些有用的链接:

  • 代码优雅是值得商榷的. (4认同)

jdi*_*tal 7

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

case 1,2,3: do(this); break;
case 4,5,6: do(that); break;
Run Code Online (Sandbox Code Playgroud)

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


Dar*_*ron 7

我忽略了这种低级优化通常不重要,可能与编译器不同.

我要说的主要区别在于可读性.if/else非常灵活,但是当你看到一个开关时,你就知道所有的测试都是针对同一个表达式的.


Jus*_*ing 5

除了其他提到的 .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;

}
Run Code Online (Sandbox Code Playgroud)