我一直想知道这件事已经有一段时间了.我到目前为止还不是一个核心程序员,主要是小型Python脚本,我写了几个分子动力学模拟.对于真正的问题:switch语句有什么意义?你为什么不能只使用if-else语句?
感谢您的回答,如果之前有人询问过,请指向我的链接.
编辑
S.Lott指出,这可能是问题If/Else vs. 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
接下来是交换机版本:
// 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之外的其他值.但是,这应该说明这个概念.
可以通过编译 r 来优化开关- 您将获得更快的代码.
在处理可枚举类型时,我发现它更优雅.
总结一下switch语句给你性能 + 代码优雅 :)
以下是一些有用的链接:
C#中switch与if/else的速度比较
反馈引导开关语句优化(pdf描述开关语句优化)
为表达性,switch/case语句允许您将多个案例组合在一起,例如:
case 1,2,3: do(this); break; case 4,5,6: do(that); break;
为了提高性能,编译器有时可以将switch语句优化为跳转表.
我忽略了这种低级优化通常不重要,可能与编译器不同.
我要说的主要区别在于可读性.if/else非常灵活,但是当你看到一个开关时,你就知道所有的测试都是针对同一个表达式的.