Hice este código sólo para fines de aprendizaje. Pero al hacerlo encontré un problema. Aquí x es un entero constante, todavía el comstackdor me está dando un error. Estoy usando el comstackdor gcc. Por favor explique cuál es la razón de este error y cómo evitarlo.
#include int main() { int const x = 10; int y = 20; switch(y) { case x: //error: case label does not reduce to an integer constant printf("value of x: %d\n",x); break; } }
puede utilizar el preprocesador como solución alternativa:
#define X 10 // ... case X:
La gramática para una instrucción de cambio en C es la siguiente:
selection-statement: switch ( expression ) statement labeled-statement: case constant-expression : statement default : statement
Por lo tanto, solo puede utilizar expresiones constantes como “valor de caso”. La expresión constante no es lo mismo que la variable constante . En otras palabras, lo siento, pero no puedes hacer eso.
Es posible que sepa que x
es una constante, pero el comstackdor no puede garantizarlo: aún es posible modificar x
en C. Una forma es tomar su dirección (a través de un puntero) y eliminarla.
En C solo puedes activar tipos de integrales literales; Más formalmente, una expresión constante .
En este caso, debe usar una instrucción if
porque el switch()
C no toma una expresión. Se necesita una constante.
case
declaraciones de case
necesitan constantes. Podrías lograr algo similar a lo que estás haciendo con una macro.
#define TEN 10 #include int main() { int const x = TEN; int y = 20; switch(y) { case TEN: //error: case label does not reduce to an integer constant printf("value of x: %d\n",x); break; } }