switch语句中case节之前的默认子句

Net*_*ire 9 c switch-statement

在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;
}
Run Code Online (Sandbox Code Playgroud)

也许这不是一个很好的例子,但我无法理解它是如何工作的,是什么促使Linus将默认部分放在switch语句的前面.

Jar*_*Par 12

代码中块case内的标签顺序switch与执行哪一个无关.该default如果没有标签执行case匹配,或者从漏网case上面.在代码库中首先使用它不会改变它.

拥有第一个优势的一个好处default是,不可能case无意中或有意地落到它上面default.default当且仅当值与块中的case语句不匹配时,此方法才会运行switch.

为了变得非常迂腐,你仍然可以default用明确的方式击中标签goto.这是非常罕见的.

  • @Ziffusion的推理如下:人们认为只有在没有匹配值时才能触发`default`.将它置于顶部使得在视觉上更容易验证这确实是这种情况.它还会使未来的增加更加明显,并且违反了关于"默认"的假设.请注意,我并不是说我同意,这只是其他人过去向我提出的逻辑 (3认同)