Использование 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...