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之外的其他值.但是,这应该说明这个概念.
aku*_*aku 23
可以通过编译 r 来优化开关- 您将获得更快的代码.
在处理可枚举类型时,我发现它更优雅.
总结一下switch语句给你性能 + 代码优雅 :)
以下是一些有用的链接:
为表达性,switch/case语句允许您将多个案例组合在一起,例如:
case 1,2,3: do(this); break;
case 4,5,6: do(that); break;
Run Code Online (Sandbox Code Playgroud)
为了提高性能,编译器有时可以将switch语句优化为跳转表.
除了其他提到的 .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)