2016-04-27 6 views
4

ich über diesen Code gestolpert, die wie erwartet funktioniert:Standalone-Pause innerhalb einer switch-Anweisung

switch (ev->deviceType) { 

    break; 

    case DEVICE_TS1E0: 
     //some code 
     break; 

    case DEVICE_TS1E3: 
     //some code 
     break; 

    default: 
     //some logging 
     break; 
} 

Jetzt gibt es eine einsames break; zu Beginn des Schalters, das keine Wirkung zu haben scheint.

Gibt es Umstände, unter denen break; einen Effekt haben könnte?

+6

Das sieht aus wie der Rest eines schlechten Code Cleanup für mich ... –

+0

@JoachimPileborg das nichts Unerwartetes tut. Selbst wenn der "Schalter" in einer Schleife ist, ist der streunende "Bruch" ein NOP. –

Antwort

4

TL; DR Das break Anweisung ist unwirksam und ein Dead-Code. Die Kontrolle wird niemals dorthin gelangen.

C11 Standard hat ein ziemlich gutes Beispiel für einen ähnlichen Fall, lassen Sie mich das gerade zitieren.

Von Kapitel §6.8.4.2/7, (emphasis Mine)

BEISPIEL im künstlichen Programmfragment

switch (expr) 
{ 
    int i = 4; 
    f(i); 
case 0: 
    i = 17; 
    /* falls through into default code */ 
default: 
    printf("%d\n", i); 
} 

das Objekt, dessen Kennung i existiert mit automatischer Speicherdauer (innerhalb des Blocks) aber ist nie initialisiert, und damit, wenn der steuernde Ausdruck einen Wert ungleich Null hat, der Aufruf an die printf Funktion wird Zugriff auf einen unbestimmten Wert. Ebenso kann der Aufruf der Funktion f nicht erreicht werden.

+1

Ich frage mich eigentlich, warum der Standard etwas anderes als Variablendeklarationen vor dem ersten Fall erlaubt. –

+1

@MichaelWalz Das ist die gleiche Situation wie in 'if (foo) {return; } else {Rückkehr; } return; ', es gibt einen toten Code, aber es muss ein gültiger Code sein. – fluter

+0

@fluter sicher, aber der Standard könnte solche Konstrukte verbieten, weil _any_ Aussagen anders als Deklarationen vor dem ersten 'case' keinen Effekt haben. –

2

Diese Aussage, zusammen mit anderen Aussagen, die nicht in einer case Klausel in switch Anweisung sind, sind unerreichbarer Code, aka toter Code. Das bedeutet, dass sie sowieso nicht laufen werden. Es wird nicht empfohlen, sie zu verwenden.

Verwandte Themen