Używanie continue w instrukcji switch
Chcę przeskoczyć ze środka instrukcji switch
do instrukcji loop 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 jest to prawidłowy sposób użycia continue
? Czy continue
wypowiedzi są ignorowane przez switch
wypowiedzi? Czy C i C++ różnią się tutaj zachowaniem?
6 answers
Jest w porządku, continue
instrukcja odnosi się do pętli zamykającej, a Twój kod powinien być równoważny (unikanie takich instrukcji skoku):
while (something = get_something()) {
if (something == A || something == B)
do_something();
}
Ale jeśli spodziewasz się, że break
zakończy pętlę, jak sugeruje twój komentarz (zawsze próbuje ponownie z innym czymś, dopóki nie oceni false), będziesz potrzebował innej struktury.
Na przykład:
do {
something = get_something();
} while (!(something == A || something == B));
do_something();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-01 18:40:12
Tak, jest OK - to tak, jakby używać go w if
wypowiedzi. Oczywiście nie można użyć break
, aby wyrwać się z pętli wewnątrz przełącznika.
Jest poprawna składniowo i stylistycznie.
Dobry styl wymaga, aby każde case:
zdanie kończyło się jednym z następujących elementów:
break;
continue;
return (x);
exit (x);
throw (x);
//fallthrough
Dodatkowo, po case (x):
natychmiast z
case (y):
default:
Jest dopuszczalne-łączenie kilku przypadków, które mają dokładnie taki sam efekt.
Wszystko inne jest podejrzewane o błąd, tak jak if(a=4){...}
Oczywiście trzeba zamknąć pętlę (while
, for
, do...while
) dla continue
do pracy. Nie wróci do case()
sam. Ale konstrukcja typu:
while(record = getNewRecord())
{
switch(record.type)
{
case RECORD_TYPE_...;
...
break;
default: //unknown type
continue; //skip processing this record altogether.
}
//...more processing...
}
...jest w porządku.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-04 04:57:09
Chociaż technicznie poprawne, wszystkie te skoki zaciemniają przepływ sterowania - szczególnie twierdzenie continue
.
A może
while (something = get_something())
{
switch (something)
{
case A:
case B:
do_something();
}
}
Jest krótszy i wykonuje swoje rzeczy w bardziej przejrzysty sposób.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-10 10:50:36
Tak, continue zostanie zignorowane przez polecenie switch i przejdzie do warunku testowanej pętli. Chciałbym podzielić się tym wyciągiem z C Programming Language reference autorstwa Ritchie "Instrukcja continue jest związana z break, ale rzadziej używana; powoduje rozpoczęcie kolejnej iteracji pętli enclosing for, while lub do. W while I do oznacza to, że część testowa jest wykonywana natychmiast; w for Kontrola przechodzi do kroku przyrostu. The continue statement dotyczy tylko pętli, a nie przełączania. Kontynuacja wewnątrz przełącznika wewnątrz pętli powoduje następną iterację pętli."
Nie jestem pewien co do C++.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-16 14:25:04
Switch nie jest uważany za pętlę, więc nie można użyć Continue wewnątrz instrukcji case w Switchu...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-26 19:15:20