2010-01-27 4 views
56

ich aus der Mitte einer switch Anweisung springen mag, auf die Schleifenanweisung in dem folgenden Code:die Verwendung in einer switch-Anweisung weiterhin

while (something = get_something()) 
{ 
    switch (something) 
    { 
    case A: 
    case B: 
     break; 
    default: 
     // get another something and try again 
     continue; 
    } 
    // do something for a handled something 
    do_something(); 
} 

Ist dies eine gültige Weise continue zu benutzen? Werden continue Anweisungen von switch Anweisungen ignoriert? Unterscheiden sich C und C++ von ihrem Verhalten?

+0

Ihre Idee ist gut, aber die obige Schleife wird 'do_something() 'niemals ausführen. – antik

+4

Selbst wenn die Kontrolle Fall A oder Fall B erreicht? –

+13

würde ich sagen, Antik ist falsch daran. Im Fall von A oder B wird dann do_something() ausgeführt. Mit Standard wird es Kaution. – acron

Antwort

42

Es ist in Ordnung, bezieht sich die continue Anweisung an die umgebenden Schleife, und der Code sollte (Vermeidung solcher Sprunganweisungen) entsprechen:

while (something = get_something()) { 
    if (something == A || something == B) 
     do_something(); 
} 

Aber wenn Sie break erwarten, dass die Schleife verlassen, wie Sie Ihren Kommentar suggerieren (es versucht immer wieder mit einem anderen etwas, bis es falsch auswertet), du brauchst eine andere Struktur.

Zum Beispiel:

do { 
    something = get_something(); 
} while (!(something == A || something == B)); 
do_something(); 
+1

"äquivalent" nur im semantischen Sinne. Der Code, den der Compiler generiert, ist sehr unterschiedlich. Mit einer switch-Anweisung kann der Compiler eine Jump-Tabelle generieren, die mehrere Vergleiche vermeidet und somit viel schneller ist als ein Vergleich mit jedem Element 1 mal 1. – chacham15

+0

+1 für "continue-Anweisung bezieht sich auf die umschließende Schleife" – onmyway133

+0

@ chacham15, why couldn ' t Der Compiler erzeugt für beide den gleichen Code? – avakar

18

Ja, es ist in Ordnung - es ist wie in einer if Aussage. Natürlich können Sie keine break verwenden, um aus einer Schleife innerhalb eines Schalters auszubrechen.

+0

Aber 'if' hat keinen Einfluss auf das Verhalten von' continue' oder 'break'. Wie meinst du es ist gleich? –

+0

@Matt Ich meine, es wird die Schleife in beiden Fällen fortsetzen. –

+1

@Neil, okay, Verwirrung vermieden. –

4

Während technisch gültig, all diese Sprünge obskurer Steuerfluss - vor allem der continue Aussage.

Ich würde einen solchen Trick als letztes Mittel verwenden, nicht das erste.

Wie wäre es

while (something = get_something()) 
{ 
    switch (something) 
    { 
    case A: 
    case B: 
     do_something(); 
    }   
} 

Es ist kürzer und seine Sachen in einer klaren Art und Weise durchzuführen.

+1

Sorry für die Verwirrung Alexander, der Code ist nur zur Demonstration, ich habe guten Grund (glaube ich) für die tatsächliche Struktur in meinem Code. –

+2

@Matt: Das würde wahrscheinlich eine noch mehr verschleierte Struktur bedeuten ... :) – visitor

+0

@visitor, ja es tut –

5

Es ist syntaktisch korrekt und stilistisch in Ordnung.

Guter Stil erfordert jede case: Anweisung sollte mit einem der folgenden Ende:

break; 
continue; 
return (x); 
exit (x); 
throw (x); 
//fallthrough 

Zusätzlich folgende case (x): sofort mit

case (y): 
default: 

zulässig ist - mehrere Fälle zu bündeln, die genau die gleiche Wirkung haben .

sonst Alles, was vermutet wird, einen Fehler zu sein, genau wie if(a=4){...} Natürlich brauchen Sie umschließenden Schleife (while, for, do...while) für continue zu arbeiten. Es wird nicht alleine auf case() zurückgeschleift. Aber ein Konstrukt wie:

while(record = getNewRecord()) 
{ 
    switch(record.type) 
    { 
     case RECORD_TYPE_...; 
      ... 
     break; 
     default: //unknown type 
      continue; //skip processing this record altogether. 
    } 
    //...more processing... 
} 

... ist in Ordnung.

+2

Entschuldigung für nekoposting, aber ich würde hinzufügen, dass ein Aufruf an 'exit' wäre auch in der Regel eine feine Sache zu Ende ein Schalterfall mit. – Vality

2

Ja, continue wird von der switch-Anweisung ignoriert und wechselt in den Zustand der zu testenden Schleife. Ich möchte diesen Auszug aus der C-Programmiersprache Referenz von Ritchie teilen "Die Continue-Anweisung bezieht sich auf Break, aber weniger häufig verwendet; es verursacht die nächste Iteration der umschließenden für, während oder do-Schleife zu beginnen.In der while und do bedeutet dies, dass der Testteil sofort ausgeführt wird; in dem geht die Steuerung zu dem Inkrementierungsschritt über. Die continue-Anweisung gilt nur für Schleifen, nicht zum Umschalten. Ein Fortsetzen innerhalb eines Schalters innerhalb einer Schleife bewirkt die nächste Schleifeniteration. "

Ich bin für das über C++ nicht sicher.

-1

Schalter nicht als Schleife betrachtet wird, so dass Sie nicht in einer Case-Anweisung in Schalter weiter verwenden können ...

+0

Die Anweisung 'switch' befindet sich in einer while-Schleife, also ist" continue "perfekt gültig. – Rick

Verwandte Themen