切换if-else语句的优点是什么?

  • 回答 (2)
  • 关注 (0)
  • 查看 (24)

使用switch语句的最佳做法是使用if30个unsigned枚举的语句,其中约10个具有预期的操作(目前是相同的操作)。性能和空间需要考虑,但并不重要。我已经抽象出了这个片段,所以不要因为命名约定而讨厌我。

switch 声明:

// numError is an error enumeration type, with 0 being the non-error case
// fire_special_event() is a stub method for the shared processing

switch (numError)
{  
  case ERROR_01 :  // intentional fall-through
  case ERROR_07 :  // intentional fall-through
  case ERROR_0A :  // intentional fall-through
  case ERROR_10 :  // intentional fall-through
  case ERROR_15 :  // intentional fall-through
  case ERROR_16 :  // intentional fall-through
  case ERROR_20 :
  {
     fire_special_event();
  }
  break;

  default:
  {
    // error codes that require no additional action
  }
  break;       
}

if 声明:

if ((ERROR_01 == numError)  ||
    (ERROR_07 == numError)  ||
    (ERROR_0A == numError)  || 
    (ERROR_10 == numError)  ||
    (ERROR_15 == numError)  ||
    (ERROR_16 == numError)  ||
    (ERROR_20 == numError))
{
  fire_special_event();
}
AcademyCityLv6AcademyCityLv6提问于
黄易音乐战组程序员回答于
已采纳

使用开关。

在最糟糕的情况下,编译器会生成与if-else链相同的代码,所以不会丢失任何东西。如果有疑问,将最常见的情况首先放入switch语句中。

在最好的情况下,优化器可能会找到更好的方法来生成代码。编译器通常做的事情是构建一个二叉决策树(在一般情况下保存比较和跳转)或者简单地构建一个跳转表(根本不需要比较)。

萧雨牧歌潜行者回答于

对于你在示例中提供的特例,最清晰的代码可能是:

if (RequiresSpecialEvent(numError))
    fire_special_event();

显然,这只是将问题转移到代码的不同区域,但现在您有机会重用此测试。你也有更多的选择来解决它。你可以使用std :: set,例如:

bool RequiresSpecialEvent(int numError)
{
    return specialSet.find(numError) != specialSet.end();
}

扫码关注云+社区