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 が switch ステートメントの前に default-section を配置するようになったのか理解できません。

4

1 に答える 1

15

caseコード内のブロック内のラベルの順序は、switch実行されるラベルとは関係ありません。defaultラベルは、一致しない場合、またはその上から落ちた場合に実行されcaseますcase。コードベースの最初に配置しても、これは変わりません。

default最初であることの利点の 1 つは、それcaseより上の a が偶然または意図的に に落ちることがあり得ないことdefaultです。これは、値がブロック内のステートメントにdefault一致しない場合にのみ実行されることを意味します。caseswitch

default非常に衒学的であるために、明示的にラベルを付けることができますgoto。しかし、それはかなりまれです。

于 2013-08-27T15:59:42.390 に答える