Ich möchte von der Mitte einer switch
Anweisung zur Schleifenanweisung im folgenden Code springen :
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 Verwendung continue
? Werden continue
Anweisungen von switch
Anweisungen ignoriert ? Unterscheiden sich C und C ++ in ihrem Verhalten hier?
do_something()
.goto
.Antworten:
Es ist in Ordnung, die
continue
Anweisung bezieht sich auf die einschließende Schleife, und Ihr Code sollte äquivalent sein (um solche Sprunganweisungen zu vermeiden):while (something = get_something()) { if (something == A || something == B) do_something(); }
Wenn Sie jedoch erwarten
break
, die Schleife zu verlassen, wie in Ihrem Kommentar vorgeschlagen (es wird immer wieder mit einem anderen Element versucht, bis es als falsch ausgewertet wird), benötigen Sie eine andere Struktur.Zum Beispiel:
do { something = get_something(); } while (!(something == A || something == B)); do_something();
quelle
Ja, es ist in Ordnung - es ist wie in einer
if
Anweisung. Natürlich können Sie a nicht verwendenbreak
, um aus einer Schleife innerhalb eines Schalters auszubrechen.quelle
if
aber keinen Einfluss auf das Verhalten voncontinue
oderbreak
. Wie meinst du es ist gleich?Ja, continue wird von der switch-Anweisung ignoriert und wechselt zum Zustand der zu testenden Schleife. Ich möchte diesen Auszug aus der Referenz zur Programmiersprache C von Ritchie teilen:
Da bin ich mir für C ++ nicht sicher.
quelle
Es ist syntaktisch korrekt und stilistisch in Ordnung.
Für einen guten Stil muss jede
case:
Aussage mit einer der folgenden Aussagen enden:break; continue; return (x); exit (x); throw (x); //fallthrough
Zusätzlich
case (x):
sofort mitcase (y): default:
ist zulässig - Bündelung mehrerer Fälle, die genau den gleichen Effekt haben.
Alles andere steht im Verdacht , einen Fehler zu sein, genau wie
if(a=4){...}
Natürlich brauchen Sie umschließenden Schleife (while
,for
,do...while
) fürcontinue
an die Arbeit. Es wird nicht zucase()
alleine zurückkehren. 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... }
...es ist okay.
quelle
exit
normalerweise auch eine gute Sache ist, um einen Switch-Fall zu beenden.default:
dies nicht der letzte / unterste Eintrag sein muss - wie diese Frage zeigt ...default:
den ersten als den letzten Fall zu machen . Zum Beispiel "Tun Sie dies, es sei denn, Sie erhalten die folgenden ungewöhnlichen Werte, die wie folgt behandelt werden sollten".Alle diese Sprünge sind zwar technisch gültig, verdecken jedoch den Kontrollfluss - insbesondere die
continue
Aussage.Ich würde einen solchen Trick als letzten Ausweg verwenden, nicht als ersten.
Wie wäre es mit
while (something = get_something()) { switch (something) { case A: case B: do_something(); } }
Es ist kürzer und führt seine Sachen klarer aus.
quelle
Dies könnte ein Megabit zu spät sein, aber Sie können verwenden
continue 2
.Einige PHP Builds / Configs geben diese Warnung aus:
Zum Beispiel:
$i = 1; while ($i <= 10) { $mod = $i % 4; echo "\r\n out $i"; $i++; switch($mod) { case 0: break; case 2: continue; break; default: continue 2; break; } echo " is even"; }
Dies wird Folgendes ausgeben:
out 1 out 2 is even out 3 out 4 is even out 5 out 6 is even out 7 out 8 is even out 9 out 10 is even
Getestet mit PHP 5.5 und höher.
quelle
Switch wird nicht als Schleife betrachtet, daher können Sie Continue nicht in einer case-Anweisung in switch verwenden ...
quelle
switch
Anweisung befindet sich in einerwhile
Schleife undcontinue
ist daher absolut gültig.