Chcę przejść ze środka switch
instrukcji do instrukcji pętli w następującym kodzie:
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();
}
Czy to prawidłowy sposób użycia continue
? Czy continue
stwierdzenia są ignorowane przez switch
oświadczenia? Czy C i C ++ różnią się tutaj zachowaniem?
do_something()
.goto
.Odpowiedzi:
W porządku,
continue
instrukcja odnosi się do otaczającej pętli, a Twój kod powinien być równoważny z (unikając takich instrukcji skoku):while (something = get_something()) { if (something == A || something == B) do_something(); }
Ale jeśli spodziewasz
break
się wyjścia z pętli, jak sugeruje twój komentarz (zawsze próbuje ponownie z czymś innym, dopóki nie uzyska wartości false), będziesz potrzebować innej struktury.Na przykład:
do { something = get_something(); } while (!(something == A || something == B)); do_something();
źródło
Tak, jest OK - to tak, jakby używać go w
if
oświadczeniu. Oczywiście nie można użyćbreak
do wyrwania pętli z wnętrza przełącznika.źródło
if
nie ma wpływu na zachowaniecontinue
lubbreak
. Co masz na myśli mówiąc, że jest podobny?Tak, kontynuacja zostanie zignorowana przez instrukcję switch i przejdzie do stanu testowanej pętli. Chciałbym udostępnić ten fragment z referencji The C Programming Language autorstwa Ritchie:
Nie jestem tego pewien w przypadku C ++.
źródło
Jest poprawna składniowo i stylistycznie w porządku.
Dobry styl wymaga, aby każde
case:
stwierdzenie kończyło się jednym z poniższych:break; continue; return (x); exit (x); throw (x); //fallthrough
Dodatkowo,
case (x):
natychmiast pocase (y): default:
jest dopuszczalne - łączenie kilku przypadków, które mają dokładnie ten sam skutek.
Coś jeszcze podejrzewa się błąd, podobnie jak
if(a=4){...}
Oczywiście trzeba zamykając pętlę (while
,for
,do...while
) docontinue
do pracy. Nie zapętli się z powrotem docase()
samotności. Ale konstrukcja taka jak:while(record = getNewRecord()) { switch(record.type) { case RECORD_TYPE_...; ... break; default: //unknown type continue; //skip processing this record altogether. } //...more processing... }
...jest ok.
źródło
exit
również byłoby dobrą rzeczą, aby zakończyć sprawę przełącznika.default:
nie musi to być ostatni / dolny wpis - jak wskazuje to pytanie ...default:
przypadku pierwszym, a nie ostatnim. Na przykład „zrób to, chyba że otrzymasz następujące nietypowe wartości, które powinny być obsługiwane w następujący sposób”.Chociaż technicznie poprawne, wszystkie te skoki zaciemniają przepływ sterowania - zwłaszcza
continue
oświadczenie.Takiego triku użyłbym w ostateczności, a nie jako pierwszy.
Co powiesz na
while (something = get_something()) { switch (something) { case A: case B: do_something(); } }
Jest krótszy i działa w bardziej przejrzysty sposób.
źródło
Może to być megabit za późno, ale możesz użyć
continue 2
.Niektóre kompilacje / konfiguracje php wyświetlą to ostrzeżenie:
Na przykład:
$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"; }
Spowoduje to wyświetlenie:
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
Testowane z PHP 5.5 i nowszym.
źródło
Przełącznik nie jest traktowany jako pętla, więc nie można używać Continue w instrukcji case w przełączniku ...
źródło
switch
Stwierdzenie jest wewnątrzwhile
pętli, więccontinue
jest całkowicie poprawny.