Historia de la cuestión:
El operador switch fue introducido en el lenguaje C para facilitar el control de flujo a través de varias ramas en función del valor de una expresión. Es una alternativa a una larga cadena de if-else y se utiliza ampliamente para el manejo de comandos, estados y valores de enumeraciones.
Problema:
Los principales peligros del operador switch están relacionados con los operadores break olvidados, la llegada inesperada a un "deslizamiento" (fallthrough), dificultades con las variables declaradas dentro del bloque, así como el hecho de que el tipo de expresión debe ser entero.
Solución:
Para un uso seguro:
break (o marcar explícitamente la necesidad de fallthrough con comentarios);int o compatibles con este;case en la rama default;case, o en el ámbito de {}.Ejemplo de código:
#include <stdio.h> void print_day(int day) { switch (day) { case 1: printf("Lunes "); break; case 2: printf("Martes "); break; case 3: printf("Miércoles "); break; case 4: printf("Jueves "); break; case 5: printf("Viernes "); break; case 6: case 7: printf("Fin de semana "); break; default: printf("Día desconocido "); } }
Características clave:
case deben ser únicas.¿Se puede usar el tipo float en la expresión switch?
No. El estándar del lenguaje C requiere que la expresión en switch sea entera o convertida a entera (char, short, int, long, enum, etc.).
¿Qué ocurrirá si se intercambian los cases — afecta el orden a la lógica?
El orden de las declaraciones case en switch no afecta la búsqueda del valor deseado. El código se ejecuta comenzando desde el case coincidente hasta el primer break. Pero el orden afecta si no hay break (fallthrough).
¿Se pueden declarar variables dentro de case sin llaves?
No. Si se declara una variable después de case sin un bloque adicional {} — esto causará un error de compilación. Correcto:
switch (x) { case 1: { int y = 0; break; } }
En un gran proyecto, un programador olvidó el break después de uno de los case y obtuvo la ejecución errónea de varias ramas consecutivas. El error sólo fue notado por el usuario.
Ventajas:
Desventajas:
En caso de que se necesitara el deslizamiento, se aplicaron fallthrough comentados con explicación, todos los cases críticos fueron acompañados de break o return, y en default se emitió una advertencia.
Ventajas:
Desventajas: