Использование continue в инструкции switch

Я хочу прыгнуть с середины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? Are continue заявления игнорируются switch заявления? Отличаются ли C и c++ своим поведением здесь?

6 ответов


все в порядке,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();

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


это синтаксически правильно и стилистически нормально.

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

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

кроме того, после case (x): немедленно

 case (y):
 default:

допустимо-связывание нескольких случаев, которые имеют точно такой же эффект.

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

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

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


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

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

как о

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

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


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

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


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