有什么理由使用 switch 语句代替 if 和 elseif 的字符串

Is there any reason to use switch statement instead of strings of if and elseif?

本文关键字:if elseif 字符串 语句 理由 什么 switch      更新时间:2023-10-16

可能的重复项:
切换 if-else 语句
的优势 为什么是 switch 语句而不是 if-else?

switch 语句似乎完全没用。它可以做的任何事情都可以通过if和else if链接来完成。

它们甚至可能编译为相同的代码。

那么为什么要费心呢?

switch 中的break语句让我发疯,这种label:格式让我想起了 goto。

这是针对 objective-c、c、C++。我不确定 vb.net 是否有switch语句,但即使有,我也必须忘记了,因为我从不使用它。

它们很可能编译为相同的代码。但目的不一定是提供更好的编译代码,而是提供更好的源代码

您也可以使用 ifgoto 进行whilefor循环,但这不会使whilefor毫无用处。您是否愿意拥有:

for (i = 0; i < 10; i++)
    doSomethingWith (i);

或:

    i = 0;
loop12:
    if (! (i < 10))
        goto skip12
    doSomethingWith (i);
    i++;
    goto loop12
skip12:
if (color == WHITE)
{
}
else if (color == BLACK)
{
}
else if (color == GREY)
{
}
else if ((color == ORANGE) || (color == GREEN) || (color == BLUE))
{
}
else
{
}

switch(color)
{
   case WHITE:
       break;
   case BLACK:
       break;
   case GREY:
       break;
   case ORANGE:
   case GREEN:
   case BLUE:
       break;
   default:
       break;
}

后者不是更具可读性并且需要更少的击键吗?

<小时 />

除了可读性之外,开关盒还有另一个独特的用途:达夫的设备。 该技术利用了switch-casewhile相结合的goto性。

void dsend(char* to, char* from, count) {
  int n = (count + 7) / 8;
  switch (count % 8) {
  case 0: do {
      *to = *from++;
      case 7: *to = *from++;
      case 6: *to = *from++;
      case 5: *to = *from++;
      case 4: *to = *from++;
      case 3: *to = *from++;
      case 2: *to = *from++;
      case 1: *to = *from++;
    } while (--n > 0);
  }
}

在最坏的情况下,开关的性能与 if 和 if 块相同。可能会更好。这在前面已经讨论过:切换if-else语句的优势

优点:

Switch提供了比if更好的程序编写方法

Switchif工作得更快,因为在执行过程中编译器会生成跳转表来决定满足哪种情况,而不是检查满足哪种情况!

缺点:

case只能有intchar常量或计算结果为其中之一的表达式!