2013-08-27 3 views
8

Нашел в Linux/ядро ​​/ 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; 
} 

Может быть, это не совсем хороший пример, но я не могу понять, как это работает, и что побудило Линуса поставить раздел по умолчанию перед оператором switch.

+0

'x = * ++ s & ~ * ++ m;' == 'x = (* (++ s)) & (~ (* (++ m)));' ..'default: 'как любой другой случай, если вы не пишете как последний, вам нужно добавить инструкцию' break; 'по той же причине, которую мы имеем в другом случае –

ответ

10

Порядок case ярлыков в блоке switch в коде не имеет ничего общего с тем, какой из них выполнен. Надпись default выполняется, если нет case, или она проходит через case над ней. Наличие его сначала в базе кода не меняет этого.

Единственное преимущество иметь default быть первым в том, что над ним не должно быть case, чтобы случайно или намеренно провалиться до default. Это означает, что default будет работать, если и только если значение не соответствует case операторам в блоке switch.

Чтобы быть чрезвычайно педантичным, вы все равно можете нанести ярлык default с явным goto. Это довольно редко.

+1

Не уверен, что я полностью получу рассуждения для второй части ответа. Предполагалось, что более опасно попасть в дефолт, чем в любом другом случае? – Ziffusion

+3

@ Ziffusion рассуждения таковы: люди считают, что 'default' следует ударять только в том случае, если нет соответствующего значения. Поставить его наверху визуально легче проверить, это действительно так. Это также делает будущие дополнения, которые проваливаются и нарушают предположение о том, что 'default' намного более заметен. Заметьте, я не говорю, что согласен с этим, это просто логика, представленная мне в прошлом – JaredPar

+1

Большое вам спасибо @JaredPar, я думал, что swith-case работает как 'if ('a') {/ * something * /} else if ('b') {/ * something else * /} else {/ * совершенно другой * /} ', а предложение' default' - это что-то вроде последнего 'else' без' if (.. .) '. Я думаю, что это важный аспект языка C, поэтому еще раз спасибо. – Netherwire

Смежные вопросы