当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么switch语句而不是if-else?》经验,为你挑选了4个好方法。

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

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

编辑

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



1> Judge Maygar..:

开关构建体更容易地转换成一个跳跃(或分支)表.当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之外的其他值.但是,这应该说明这个概念.


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

2> aku..:

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

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

以下是一些有用的链接:

C#中switch与if/else的速度比较

反馈引导开关语句优化(pdf描述开关语句优化)


代码优雅是值得商榷的.

3> jdigital..:

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

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

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



4> Darron..:

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

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

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有