Quiero saltar desde el medio de una switchdeclaració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 continuedeclaraciones ignoran las switchdeclaraciones? ¿C y C ++ difieren en su comportamiento aquí?

do_something().goto.Respuestas:
Está bien, la
continuedeclaració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
breaksalir 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
ifdeclaración. Por supuesto, no puede usar abreakpara salir de un bucle desde el interior de un interruptor.fuente
ifno tiene ningún efecto sobre el comportamiento decontinueobreak. ¿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); //fallthroughAdemá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) paracontinueel 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
exittambié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
continuedeclaració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 evenProbado 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
switchdeclaración está dentro de unwhilebucle, por lo quecontinuees perfectamente válida.