tipos significado rangos que programacion inicializar declaracion constantes como c switch-statement compiler-design

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.