Quero pular do meio de uma switch
instrução para a instrução de loop no seguinte código:
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();
}
Esta é uma forma válida de usar continue
? As continue
declarações são ignoradas pelas switch
declarações? C e C ++ diferem em seu comportamento aqui?
do_something()
.goto
.Respostas:
Tudo bem, a
continue
instrução está relacionada ao loop envolvente e seu código deve ser equivalente a (evitando essas instruções de salto):while (something = get_something()) { if (something == A || something == B) do_something(); }
Mas se você espera
break
sair do loop, como seu comentário sugere (ele sempre tenta novamente com outro algo, até que seja avaliado como falso), você precisará de uma estrutura diferente.Por exemplo:
do { something = get_something(); } while (!(something == A || something == B)); do_something();
fonte
Sim, está tudo bem - é como usá-lo em uma
if
declaração. Claro, você não pode usar umbreak
para sair de um loop de dentro de um switch.fonte
if
não tem efeito sobre o comportamento decontinue
oubreak
. Como você quer dizer que é igual?Sim, continue será ignorado pela instrução switch e irá para a condição do loop a ser testado. Eu gostaria de compartilhar este trecho da referência da Linguagem de Programação C feita por Ritchie:
Não tenho certeza sobre isso para C ++.
fonte
É sintaticamente correto e estilisticamente correto.
O bom estilo exige que cada
case:
declaração termine com um dos seguintes:break; continue; return (x); exit (x); throw (x); //fallthrough
Além disso, seguindo
case (x):
imediatamente comcase (y): default:
é permitido - agrupar vários casos que têm exatamente o mesmo efeito.
Qualquer outra coisa é suspeito de ser um erro, assim como
if(a=4){...}
Claro que você precisa encerrando loop (while
,for
,do...while
) paracontinue
o trabalho. Não vai voltar acase()
ficar sozinho. Mas uma construção como:while(record = getNewRecord()) { switch(record.type) { case RECORD_TYPE_...; ... break; default: //unknown type continue; //skip processing this record altogether. } //...more processing... }
...esta bem.
fonte
exit
também normalmente seria uma boa coisa para encerrar um caso de troca.default:
não precisa ser a última entrada / parte inferior - como esta pergunta indica ...default:
o primeiro caso em vez do último. Como "faça isso, a menos que obtenha os seguintes valores incomuns, que devem ser tratados da seguinte maneira".Embora tecnicamente válidos, todos esses saltos obscurecem o fluxo de controle - especialmente a
continue
instrução.Eu usaria esse truque como último recurso, não o primeiro.
E se
while (something = get_something()) { switch (something) { case A: case B: do_something(); } }
É mais curto e tem um desempenho mais claro.
fonte
Isso pode demorar um megabit, mas você pode usar
continue 2
.Algumas compilações / configurações de php exibirão este aviso:
Por exemplo:
$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"; }
Isso resultará em:
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
Testado com PHP 5.5 e superior.
fonte
Switch não é considerado um loop, então você não pode usar Continue dentro de uma instrução case em switch ...
fonte
switch
instrução está dentro de umwhile
loop, portanto,continue
é perfeitamente válida.