rangos - tipos de variables en c++ y su significado
Cambie las declaraciones en C: variable en el caso? (4)
#include <stdio.h>
int main(int argc, char *argv[]){
char a = ''c'';
switch(''c''){
case a:
printf("hi/n");
}
return 0;
}
Lo anterior no se compilará para este error:
case label does not reduce to an integer constant
¿Por qué esto no está permitido?
El compilador tiene permiso explícito para usar un árbol binario eficiente o una tabla de salto para evaluar las declaraciones de casos.
Por esta razón, las declaraciones de casos son constantes de tiempo de compilación.
El estándar C99 dice esto (y el estándar C89 fue muy similar):
§6.8.4.2 La declaración de cambio
Restricciones
¶1 La expresión de control de una instrucción switch debe tener un tipo entero.
[...]
¶3 La expresión de cada etiqueta de caso será una expresión de entero constante y no dos de las expresiones de constante de caso en la misma instrucción de conmutación tendrán el mismo valor después de la conversión. Puede haber como máximo una etiqueta predeterminada en una declaración de cambio.
Ese es el requisito de idioma: las etiquetas de los casos serán expresiones enteras constantes, y todos los casos en un único interruptor serán únicos. Esa es la forma en que C fue diseñado. Es muy poco probable que cambie ahora (aunque el cambio no rompa ningún código actualmente válido, o incluso cambie su significado).
La idea de una sentencia switch
es que el compilador puede producir código que solo inspecciona la expresión del switch
en tiempo de ejecución y deduce la ubicación a la que saltar.
Si la etiqueta del case
pudiera ser expresiones que no son constantes, tendría que evaluar todas las expresiones de case
para ver si hay alguna que coincida. Entonces, en lugar de evaluar una expresión, debería evaluar n
expresiones, donde n
es el número de etiquetas de case
para ese switch
.
La idea del switch
es hacerlo al revés que tú. Ponga la expresión variable a
en el switch
mismo, y ponga constantes como su ''c''
en el caso.
Piensa, ¿y si tuvieras lo siguiente?
int a = 1, b = 1, c = 1;
switch (a)
{
case b: return 1;
case c: return 2;
}
¿Qué devolvería?
Las etiquetas de los casos deben ser constantes para que el compilador pueda demostrar que no hay ambigüedades.