【问题标题】:Default clause before case sections in the switch statementswitch 语句中 case 部分之前的 default 子句
【发布时间】:2013-08-27 15:57:53
【问题描述】:

在 linux/kernel/signal.c 中找到这个

switch (_NSIG_WORDS) {
default:
    for (i = 1; i < _NSIG_WORDS; ++i) {
        x = *++s &~ *++m;
        if (!x)
            continue;
        sig = ffz(~x) + i*_NSIG_BPW + 1;
        break;
    }
    break;

case 2:
    x = s[1] &~ m[1];
    if (!x)
        break;
    sig = ffz(~x) + _NSIG_BPW + 1;
    break;

case 1:
    /* Nothing to do */
    break;
}

也许这不是一个很好的例子,但我不明白它是如何工作的,以及是什么促使 Linus 将 default-section 放在 switch 语句的前面。

【问题讨论】:

  • x = *++s &amp;~ *++m; == x = (*(++s)) &amp; (~(*(++m)));..default: 就像其他任何情况一样,如果您最后没有写,您需要添加 break; 语句,原因与其他情况相同跨度>

标签: c switch-statement


【解决方案1】:

代码中switch 块中case 标签的顺序与执行哪个标签无关。如果没有case 匹配,或者它从上面的case 中落下,则执行default 标签。将它放在代码库中并不会改变这一点。

default 成为第一的一个好处是,它上面的case 不可能意外或故意落入default。这意味着当且仅当该值与 switch 块中的任何 case 语句不匹配时,default 才会运行。

为了非常迂腐,您仍然可以使用明确的goto 来点击default 标签。不过,这非常罕见。

【讨论】:

  • 不确定我是否完全理解答案第二部分的原因。假设违约比任何其他情况都更危险?
  • @Ziffusion 推理如下:人们认为default只有在没有匹配值的情况下才应该被命中。将它放在顶部可以在视觉上更容易验证确实如此。它还使未来添加的内容确实落空并违反关于default 的假设更加明显。注意我不是说我同意,这只是过去别人给我的逻辑
  • 非常感谢,@JaredPar,我认为 swith-case 的工作方式类似于 if('a'){/*something*/}else if('b'){/*something else*/} else{/*quite another*/},而 default 子句类似于没有 if(...) 的最后一个 else。我认为这是 C 语言的一个重要方面,所以再次感谢您。
猜你喜欢
  • 2018-05-05
  • 1970-01-01
  • 1970-01-01
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-13
相关资源
最近更新 更多