为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

人到中年有点甜 2019-12-21 13:00:05
我一直想知道这已经有一段时间了。到目前为止,我不是一个顽固的程序员,主要是小型Python脚本,并且已经编写了一些分子动力学模拟。对于真正的问题:switch语句的意义是什么?为什么不能只使用if-else语句?感谢您的回答,如果您之前曾被问过,请指向我的链接。S.Lott指出,这可能是If / Else vs. Switch问题的重复。如果要关闭,请关闭。我将其开放以供进一步讨论。
查看完整描述

3 回答

?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

甲开关构建体更容易地转换成一个跳跃(或分支)表。当案例标签靠在一起时,这可使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以外的其他值。但是,这应该可以说明该概念。


查看完整回答
反对 回复 2019-12-21
?
DIEA

TA贡献1820条经验 获得超2个赞

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

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


查看完整回答
反对 回复 2019-12-21
?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

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


case 1,2,3: do(this); break;

case 4,5,6: do(that); break;

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


查看完整回答
反对 回复 2019-12-21
  • 3 回答
  • 0 关注
  • 1003 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信