Estaba leyendo ¿Por qué tenemos que el uso break
de switch
? , y me llevó a preguntarme por qué se permite la caída implícita en algunos lenguajes (como PHP y JavaScript), mientras que no hay soporte (AFAIK) para la caída explícita.
No es como si fuera necesario crear una nueva palabra clave, ya continue
que sería perfectamente apropiado y resolvería cualquier problema de ambigüedad sobre si el autor quería que un caso fracasara.
El formulario actualmente admitido es:
switch (s) {
case 1:
...
break;
case 2:
... //ambiguous, was break forgotten?
case 3:
...
break;
default:
...
break;
}
Mientras que tendría sentido que se escribiera como:
switch (s) {
case 1:
...
break;
case 2:
...
continue; //unambiguous, the author was explicit
case 3:
...
break;
default:
...
break;
}
Para los propósitos de esta pregunta, ignoremos la cuestión de si los fall-through son un buen estilo de codificación.
¿Existen idiomas que permitan la caída y lo hayan hecho explícito?
¿Hay alguna razón histórica que switch
permita la caída implícita en lugar de explícita?
switch-statement
zzzzBov
fuente
fuente
goto case
, por lo que la premisa de tu pregunta es un poco errónea.goto case
en C #.goto case
, como menciona pdr.Respuestas:
Es principalmente histórico, la mayoría de los idiomas simplemente copiaron lo que hizo C.
La razón por la que C lo hizo así es que los creadores de C pretendían que las declaraciones de cambio fueran fáciles de optimizar en una tabla de salto. Esta es también la razón por la que C limita las declaraciones de cambio a valores integrales.
En una tabla de salto, el programa calculará a qué posición saltar en función de la expresión. El programa saltará a ese punto y luego continuará ejecutándose desde ese punto. Si desea omitir el resto de la tabla, debe incluir un salto al final de la tabla. C usa
break
declaraciones explícitas para que haya una correspondencia directa con esta construcción.fuente
break
y solo menos del 3% fueron fallidos . Luego usó esto como un ejemplo de que el comportamiento de falla predeterminado es contra-intuitivo y sería mejor ser inverso (use una palabra clave para indicar una falla explícita). ¡Ah, y el libro es realmente genial para explicar otras rarezas de C también, algunas de las cuales se encuentran en C ++ e incluso en C # y Java también! Todo está enraizado en B y BCPL. :)case
, que no sea la primera, debe tener el prefijo automático automáticamentebreak
, pero las marcadas+case
(o algún otro designador similar) no deberían. Eso habría sido fácil de manejar para un compilador y habría permitido las ventajas semánticas de la disposición actual, al tiempo que eliminaba muchas líneas de código.Go permite una caída explícita mediante la
fallthrough
palabra clave (el salto es implícito, pero puede ser explícito):Aquí está el bit relevante de go efectivo y la especificación del idioma .
No creo que pueda usar
goto
para ir a un caso específico, pero puede hacer una etiqueta dentro de la caja y usar unagoto
normal.Como beneficio adicional, Go le permite usar expresiones binarias, cadenas o tipos en un interruptor como declaraciones de casos.
fuente