2013-08-27 11 views
8

Znalazłem to w linux/kernel/signal.cklauzula domyślna przed sekcjach przypadek w instrukcji switch

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; 
} 

Może to nie jest dość dobry przykład, ale nie mogę zrozumieć, jak to działa i co skłoniło Linus wstawić domyślną sekcję na początku instrukcji switch.

+0

'x = * ++ s & ~ * ++ m;' == 'x = (* (++ s)) & (~ (* (++ m)));' ..'default: 'jest jak każdy inny przypadek, jeśli nie piszesz jako ostatni, musisz dodać instrukcję' break; 'z tego samego powodu co inny przypadek –

Odpowiedz

10

Kolejność etykiet case w obrębie bloku switch nie ma nic wspólnego z tym, który z nich jest wykonywany. Etykieta default jest wykonywana, jeśli nie pasuje case lub przewyższa ją z poziomu case powyżej. Posiadanie go po raz pierwszy w bazie kodu nie zmienia tego.

Jedną z zalet posiadania default na pierwszym miejscu jest to, że niemożliwe jest przypadkowe lub celowe przebicie się przez case powyżej do default. Oznacza to, że default będzie działał, jeśli i tylko jeśli wartość będzie zgodna z żadnymi instrukcjami w bloku switch.

Aby być wyjątkowo pedantycznym, można jeszcze uderzyć w etykietę default z wyraźnym goto. Jest to jednak dość rzadkie.

+1

Nie jestem pewien czy rozumiem drugą część odpowiedzi. Zakładając, że bardziej niebezpieczne jest przejście do domyślnego niż jakikolwiek inny przypadek? – Ziffusion

+3

@ Ziffusion Rozumowanie jest następujące: Ludzie uważają, że 'default' powinien być trafiony tylko wtedy, gdy nie ma pasującej wartości. Umieszczenie go na górze ułatwia weryfikację wizualną, tak właśnie jest. Tworzy także przyszłe dodatki, które przerywają i naruszają założenie o "domyślnym" bardziej widocznym. Uwaga Nie mówię, że się z tym zgadzam, jest to po prostu logika, którą inni mi przedstawili w przeszłości. – JaredPar

+1

Dziękuję bardzo, @JaredPar, myślałem, że swith-case działa jak 'if ('a') {/ * coś * /} else jeśli ('b') {/ * coś jeszcze * /} else {/ * całkiem inne * /} 'i' default' jest czymś w rodzaju ostatniego 'else' bez' if (.. .) '. Myślę, że to ważny aspekt języka C, więc jeszcze raz dziękuję. – Netherwire