10

在 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 语句的前面。

4

1 回答 1

15

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

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

要非常迂腐,您仍然可以default使用明确的goto. 不过,这非常罕见。

于 2013-08-27T15:59:42.390 回答