Yo respondería con una pregunta: ¿Por qué está usando una declaración de cambio y no si ... si es así?
Sorprendentemente, muchos programadores no hacen esa pregunta, pero lo que se refiere switch
de algo fundamental que debe estar allí en el idioma. ¡Eso no es verdad! Puede escribir cualquier clase de programa C sin usar switch
. Estrictamente hablando, switch
es una característica redundante.
¿Por qué usarlo?
La legibilidad es no la razón por la cual. switch
en realidad tiene una sintaxis mucho peor y menos intuitiva que if-else. La necesidad de declaraciones de interrupción dentro del conmutador, las reglas de sintaxis de cambio extrañas que permiten declarar un caso dentro de un ámbito local de otro caso, la ubicación arbitraria del valor predeterminado.
switch
no solo es menos legible, sino que también es mucho más propenso a errores que if-else. La ruptura olvidada es el peligro más obvio, que ha llevado a millones y millones de errores difíciles de encontrar en el software.
Otro argumento más evidente en contra switch
ser más legible es el código "hueso desnudo":
if (A)
{
}
else if (B)
{
}
else if (C)
{
}
else
{
}
switch(something)
{
case A:
{
break;
}
case B:
{
break;
}
case C:
{
break;
}
default:
{
break;
}
}
El Si y el interruptor de arriba son equivalentes en la sintaxis y la función, y debe ser compilado hasta el mismísimo codigo de maquina. Aquí están las estadísticas de este ejemplo interruptor
if-else switch
Symbols 33 65 // Not counting the expressions
Lines 12 19 // Not counting empty lines
requiere más código para el mismo resultado, por lo tanto se debe ser considerado como menos fácil de leer que if-else.
Antes de que empieces a discutir sobre cambiar el aspecto más parecido a una tabla que if-else, todo se trata de formatear el código, e irrelevante. Nada en la norma que impide escribir código como este:
if (A) {}
else if (B) {}
else if (C) {}
else {}
switch(something)
{
case A: { break; }
case B: { break; }
case C: { break; }
default: { break; }
}
yo consideraría cualquier forma que sea legible, si lo desea algún tipo de sintaxis mínima a modo de mesa.
Por supuesto, puede haber razones estéticas, supersticiosas o religiosas por las cuales switch
se deben utilizar para facilitar la lectura, pero prefiero dejar esas discusiones fuera del tema a sitios que no están relacionados con la programación.
Así que el cambio es menos seguro y menos legible que if-else. Lo que queda que puede atraer a un programador es la eficiencia. Un programador con n casos que deben ser probados por el programa seguramente desea tener algo que hace que la búsqueda de la carcasa correcta sea lo más rápida posible. Es una mala idea examinar todos los casos de forma lineal.
Como ya sabrán, es posible optimizar una mucho if-else o switch, al implementarlo como una matriz de punteros de función:
typedef void (*Func_t)(void);
const Func_t cases [N] = { ... };
cases[i]();
Esta optimización drástica a menudo es exactamente lo que un compilador lo hace cuando se encuentra con una declaración de cambio. Sin embargo, esta optimización solo se puede realizar si todos los casos son enteros adyacentes. Si no son adyacentes, entonces la adyacencia se puede crear a través de una tabla de búsqueda const.
Pero si los casos no son de tipo entero, la optimización anterior no se puede hacer. Si fueron flotadores, cadenas u otra cosa, no hay una forma sensata de optimizar el código.
Al menos en mi libro, switch
solo existe para este propósito: hace que sea más fácil para el compilador crear código más efectivo que if-else. Por lo tanto, entra dentro de la misma categoría que las palabras clave en línea, el registro, etc., que también hacen que sea más fácil para el compilador optimizar su código.
En mi humilde opinión, supongo que es debido al tamaño fijo y los valores constantes de número entero. También puedes usar char, cuando se expresa como int: http://stackoverflow.com/questions/650162/why-switch-statement-cannot-be-applied-on-strings – vaugham
Amigo, solo para tu información, las carrozas no son fácilmente comparables (piense en precisión en el lado derecho del punto decimal.) Piénselo. –