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

时间:2013-08-27 15:57:53

标签: 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;
}

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

1 个答案:

答案 0 :(得分:11)

代码中case块中switch个标签的顺序与执行哪个标签无关。如果default没有匹配,则会执行case标签,或者从case上方default开始执行。在代码库中首先使用它不会改变它。

case成为第一位的一个好处是,default以上default不可能意外地或故意地落到case。这意味着当且仅当值与switch块中的default语句不匹配时,才会运行goto

要非常迂腐,你仍然可以使用明确的{{1}}来点击{{1}}标签。这是非常罕见的。