Использование continue в операторе switch - PullRequest
69 голосов
/ 27 января 2010

Я хочу перейти с середины оператора switch на оператор цикла в следующем коде:

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();
}

Это правильный способ использования continue? continue заявления игнорируются switch заявлениями? Различаются ли C и C ++ по их поведению здесь?

Ответы [ 6 ]

50 голосов
/ 27 января 2010

Ничего, оператор continue относится к замкнутому циклу, и ваш код должен быть эквивалентен (избегая таких операторов перехода):

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

Но если вы ожидаете, что break выйдет из цикла, как подсказывает ваш комментарий (он всегда пытается снова с чем-то другим, пока не оценивается как false), вам потребуется другая структура.

Например:

do {
    something = get_something();
} while (!(something == A || something == B));
do_something();
20 голосов
/ 27 января 2010

Да, все нормально - это все равно, что использовать его в выражении if. Конечно, вы не можете использовать break для выхода из цикла внутри коммутатора.

10 голосов
/ 16 ноября 2013

Да, continue будет игнорироваться оператором switch и перейдет в состояние проверяемого цикла. Я хотел бы поделиться этой выдержкой из справочника по языку программирования C от Ritchie:

Оператор continue относится к break, но используется реже; он запускает следующую итерацию включающего цикла for, while или do. В while и do это означает, что тестовая часть выполняется немедленно; в for управление переходит к шагу приращения.

Оператор continue применяется только к циклам, а не к switch. continue внутри switch внутри цикла вызывает следующую итерацию цикла.

Я не уверен в этом для C ++.

6 голосов
/ 27 января 2010

Это синтаксически правильно и стилистически хорошо.

Хороший стиль требует, чтобы каждое выражение case: заканчивалось одним из следующих:

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

Кроме того, сразу после case (x): следует

 case (y):
 default:

допустимо - объединение нескольких дел, имеющих одинаковый эффект.

Все остальное считается ошибкой, как и if(a=4){...} Конечно, для работы continue вам необходим заключающий цикл (while, for, do...while) Это не вернется к case() в одиночку. Но такая конструкция, как:

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

... все в порядке.

5 голосов
/ 27 января 2010

Хотя технически это допустимо, все эти скачки скрывают поток управления, особенно оператор continue.

Я бы использовал такой трюк как последнее средство, а не первое.

Как насчет

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

Он короче и выполняет свои вещи более понятным образом.

0 голосов
/ 26 июля 2017

Switch не считается циклом, поэтому вы не можете использовать Continue внутри оператора case в switch ...

...