Quiero saltar desde el medio de una switch
declaración a la declaración de bucle en el siguiente 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();
}
¿Es esta una forma válida de uso continue
? ¿Las continue
declaraciones ignoran las switch
declaraciones? ¿C y C ++ difieren en su comportamiento aquí?
do_something()
.goto
.Respuestas:
Está bien, la
continue
declaración se relaciona con el bucle adjunto y su código debe ser equivalente a (evitar tales declaraciones de salto):while (something = get_something()) { if (something == A || something == B) do_something(); }
Pero si espera
break
salir del ciclo, como sugiere su comentario (siempre intenta nuevamente con otro algo, hasta que se evalúa como falso), necesitará una estructura diferente.Por ejemplo:
do { something = get_something(); } while (!(something == A || something == B)); do_something();
fuente
Sí, está bien, es como usarlo en una
if
declaración. Por supuesto, no puede usar abreak
para salir de un bucle desde el interior de un interruptor.fuente
if
no tiene ningún efecto sobre el comportamiento decontinue
obreak
. ¿Qué quieres decir con que se parece?Sí, continue será ignorado por la instrucción switch y pasará a la condición del bucle que se probará. Me gustaría compartir este extracto de la referencia del lenguaje de programación C de Ritchie:
No estoy seguro de eso para C ++.
fuente
Es sintácticamente correcto y estilísticamente correcto.
Un buen estilo requiere que cada
case:
declaración debe terminar con una de las siguientes:break; continue; return (x); exit (x); throw (x); //fallthrough
Además, siguiendo
case (x):
inmediatamente concase (y): default:
está permitido: agrupar varios casos que tienen exactamente el mismo efecto.
Todo lo demás se sospecha que es un error, al igual que
if(a=4){...}
Por supuesto que es necesario encerrar bucle (while
,for
,do...while
) paracontinue
el trabajo. No volverá a estarcase()
solo. Pero una construcción como:while(record = getNewRecord()) { switch(record.type) { case RECORD_TYPE_...; ... break; default: //unknown type continue; //skip processing this record altogether. } //...more processing... }
...está bien.
fuente
exit
también sería algo bueno para terminar un caso de interruptor.default:
default:
caso sea el primero en lugar del último. Como "haz esto, a menos que obtengas los siguientes valores inusuales, que deben manejarse de la siguiente manera".Si bien son técnicamente válidos, todos estos saltos oscurecen el flujo de control, especialmente la
continue
declaración.Usaría ese truco como último recurso, no como primer recurso.
Qué tal si
while (something = get_something()) { switch (something) { case A: case B: do_something(); } }
Es más corto y realiza su trabajo de una manera más clara.
fuente
Esto puede ser un megabit demasiado tarde, pero puede usarlo
continue 2
.Algunas compilaciones / configuraciones de php mostrarán esta advertencia:
Por ejemplo:
$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"; }
Esto dará como resultado:
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
Probado con PHP 5.5 y superior.
fuente
El interruptor no se considera un bucle, por lo que no puede usar Continuar dentro de una declaración de caso en el interruptor ...
fuente
switch
declaración está dentro de unwhile
bucle, por lo quecontinue
es perfectamente válida.