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?

Author: Matt Joiner, 2010-01-27

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();
 46
Author: visitor,
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.

 18
Author: ,
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
2010-01-27 12:26:12

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.

 5
Author: SF.,
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.

Użyłbym takiej sztuczki jako ostateczności, nie jako pierwszej.

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.

 4
Author: Alexander Poluektov,
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++.

 4
Author: Islam Elshahat,
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...

 -1
Author: Jitendra Nagar,
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