Я хочу перейти от середины 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 ++ своим поведением?
do_something()
.goto
.Ответы:
Это нормально, этот
continue
оператор относится к закрывающему циклу, и ваш код должен быть эквивалентен (избегая таких операторов перехода):while (something = get_something()) { if (something == A || something == B) do_something(); }
Но если вы ожидаете
break
выхода из цикла, как предлагает ваш комментарий (он всегда пытается снова с другим чем-то, пока не будет оценено как ложное), вам понадобится другая структура.Например:
do { something = get_something(); } while (!(something == A || something == B)); do_something();
источник
Да, это нормально - это все равно что использовать его в
if
заявлении. Конечно, вы не можете использовать abreak
для выхода из цикла внутри переключателя.источник
if
не влияет на поведениеcontinue
илиbreak
. Как вы имеете в виду, что это похожеДа, continue будет проигнорирован оператором switch и перейдет в условие цикла, которое нужно проверить. Я хотел бы поделиться этим отрывком из справочника по языку программирования C от Ричи:
Я не уверен насчет C ++.
источник
Это синтаксически правильно и стилистически приемлемо.
Хороший стиль требует, чтобы каждое
case:
утверждение заканчивалось одним из следующих слов:break; continue; return (x); exit (x); throw (x); //fallthrough
Кроме того,
case (x):
сразу послеcase (y): default:
допустимо - объединение нескольких случаев, которые имеют точно такой же эффект.
Что - нибудь еще есть подозрение, что ошибка, так же , как
if(a=4){...}
Вы , конечно , нужны ограждающий цикл (while
,for
,do...while
) дляcontinue
к работе. Он не вернется кcase()
одиночеству. Но такая конструкция, как:while(record = getNewRecord()) { switch(record.type) { case RECORD_TYPE_...; ... break; default: //unknown type continue; //skip processing this record altogether. } //...more processing... }
...хорошо.
источник
exit
также обычно был бы хорошей вещью для завершения случая переключения.default:
это не обязательно должна быть последняя / нижняя запись - как указывает этот вопрос ...default:
прецедент первым, а не последним. Например, «сделайте это, если не получите следующие необычные значения, с которыми следует обращаться следующим образом».Хотя с технической точки зрения все эти скачки затрудняют понимание потока управления - особенно
continue
утверждения.Я бы использовал такой прием в крайнем случае, а не в первую очередь.
Как насчет
while (something = get_something()) { switch (something) { case A: case B: do_something(); } }
Он короче и работает более четко.
источник
Это может быть мегабит слишком поздно, но вы можете использовать
continue 2
.Некоторые сборки / конфигурации php выводят это предупреждение:
Например:
$i = 1; while ($i <= 10) { $mod = $i % 4; echo "\r\n out $i"; $i++; switch($mod) { case 0: break; case 2: continue; break; default: continue 2; break; } echo " is even"; }
Это выведет:
out 1 out 2 is even out 3 out 4 is even out 5 out 6 is even out 7 out 8 is even out 9 out 10 is even
Протестировано с PHP 5.5 и выше.
источник
Switch не считается циклом, поэтому вы не можете использовать Continue внутри оператора case в switch ...
источник
switch
Оператор находится внутриwhile
цикла, так чтоcontinue
вполне допустимо.