2013-08-27 8 views
8

Gefunden dies in linux/kernel/signal.cStandard-Klausel vor Fall Abschnitten in der switch-Anweisung

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

Vielleicht ist das nicht ganz gutes Beispiel, aber ich kann nicht verstehen, wie es funktioniert und was Sie dazu aufgefordert Linus Standard-Abschnitt vor der switch-Anweisung setzen.

+0

'x = * ++ s & ~ * ++ m;' == 'x = (* (++ s)) & (~ (* (++ m)));' ..'default: 'ist wie jeder andere Fall, wenn Sie nicht als letzte schreiben, müssen Sie' break; 'Anweisung aus dem gleichen Grund hinzufügen wir anderen Fall –

Antwort

10

Die Reihenfolge der case Etiketten in einem switch Block im Code hat nichts damit zu tun, die ausgeführt wird. Das default Etikett wird ausgeführt, wenn kein case übereinstimmt oder es von einem case darüber fällt. Das erste in der Codebasis zu haben, ändert das nicht.

Der erste Vorteil, default zuerst zu sein, ist, dass es unmöglich ist, dass ein case darüber zufällig oder absichtlich durch default fällt. Dies bedeutet, default wird ausgeführt, wenn und nur wenn der Wert keine case Anweisungen im switch Block entspricht.

Um extrem pedantisch zu sein, könnten Sie immer noch das default Etikett mit einer expliziten goto treffen. Das ist aber ziemlich selten.

+1

Nicht sicher, ob ich die Begründung für den zweiten Teil der Antwort recht bekommen. Die Annahme ist, dass es gefährlicher ist, in den Fehlerzustand zu geraten als in jedem anderen Fall? – Ziffusion

+3

@Ziffusion die Begründung lautet wie folgt: Leute glauben, dass 'default' sollte nur getroffen werden, wenn es keinen übereinstimmenden Wert gibt. Wenn man es oben anordnet, ist es visuell einfacher zu bestätigen, dass dies tatsächlich der Fall ist. Es macht auch zukünftige Ergänzungen, die durchfallen und die Annahme über "default" viel mehr sichtbar verletzen. Hinweis: Ich sage nicht, dass ich damit einverstanden bin, das ist einfach die Logik, die andere mir in der Vergangenheit gezeigt haben. – JaredPar

+1

Vielen Dank, @JaredPar, ich dachte, dass dieser Fall funktioniert wie 'if (' a ') {/ * etwas * /} sonst if ('b') {/ * etwas anderes * /} else {/ * eine ganz andere * /} ', und' default' ist so etwas wie das letzte 'else' ohne' if (.. .) '. Ich denke, das ist ein wichtiger Aspekt der C-Sprache, also nochmals vielen Dank. – Netherwire

Verwandte Themen