切换声明Fallthrough ...应该允许吗?

只要我记得我已经避免使用switch语句。 事实上,我不记得它曾经进入我的意识,因为它是一种可能的做事方式,因为它早已钻入我的脑海,因为它只不过是转换语句中的一个错误。 但是,今天我遇到了一些通过设计使用它的代码,这让我立刻想知道社区中的每个人都认为关于switch语句的过程如何。

是编程语言应该明确不允许的东西(就像C#所做的那样,尽管它提供了一个解决方法),还是它是任何强大到足以让程序员手中的语言的特征?

编辑:我没有足够的具体到我的意思是贯穿始终。 我使用这种类型很多:

    switch(m_loadAnimSubCt){
        case 0: 
        case 1: 
            // Do something
            break;
        case 2:
        case 3:
        case 4:
            // Do something
            break;
   }

不过,我很担心这样的事情。

   switch(m_loadAnimSubCt){
        case 0: 
        case 1: 
            // Do something but fall through to the other cases 
            // after doing it.
        case 2:
        case 3:
        case 4:
            // Do something else.
            break;
   }

这种方式每当case为0,1时它将在switch语句中做所有事情。 我已经看到了这种设计,我只是不知道我是否同意switch语句应该以这种方式使用。 我认为第一个代码示例是非常有用和安全的。 第二种看起来很危险。


这可能取决于您考虑的延期。 我对这样的事情没问题:

switch (value)
{
  case 0:
    result = ZERO_DIGIT;
    break;

  case 1:
  case 3:
  case 5:
  case 7:
  case 9:
     result = ODD_DIGIT;
     break;

  case 2:
  case 4:
  case 6:
  case 8:
     result = EVEN_DIGIT;
     break;
}

但是如果你有一个案例标签,后面跟着另一个案例标签的代码,那么我总是会认为这个邪恶。 也许将公共代码移到一个函数并从两个地方调用将是一个更好的主意。

请注意,我使用C ++ FAQ定义的“邪恶”


这是一把双刃剑。 有时非常有用,通常很危险。

什么时候好? 当你想要10个案例都以相同的方式处理...

switch (c) {
  case 1:
  case 2:
            ... do some of the work ...
            /* FALLTHROUGH */
  case 17:
            ... do something ...
            break;
  case 5:
  case 43:
            ... do something else ...
            break;
}

我喜欢的一个规则是,如果你在排除中断的地方做了任何事情,你需要明确的评论/ * FALLTHROUGH * /来表明你的意图。


根据你在做什么,穿透是一件非常方便的事情。 考虑这种安排选项的简洁易懂的方法:

switch ($someoption) {
  case 'a':
  case 'b':
  case 'c':
    // do something
    break;
  case 'd':
  case 'e':
    // do something else
    break;
}

想象一下用if / else来做这件事。 这将是一个烂摊子。

链接地址: http://www.djcxy.com/p/84485.html

上一篇: Switch Statement Fallthrough...should it be allowed?

下一篇: Is there any significant difference between using if/else and switch