Usando variable para la sentencia de caso de cambio

# include  int main(void) { int var=1, x=1, y=2; switch(var) { case 'x': x++; break; case 'y': y++; break; } printf("%d %d",x,y); return 0; } 

aquí no estoy obteniendo la salida requerida ¿Alguien puede explicar por qué?

Mi salida esperada es: 2,2

En una instrucción de cambio (en C), no puede usar variables en el case . Debes usar constante.

Y también, el case 'x': no se refiere a la variable x sino a una constante 'x' que es un personaje. No está probando lo que parece querer … En este caso, está probando el case 121: donde 121 es el código ASCII para la letra ‘x’.

Puedes resolver tu problema con algo como:

 # include  #define INIT_X 1 #define INIT_Y 2 // ^^^^^^^^^^^^^ int main(void) { int var=1, x=INIT_X, y=INIT_Y; // ^^^^^^^^^^^^^^^^^^ switch(var) { case INIT_X: // ^^^^^^ x++; break; case INIT_Y: // ^^^^^^ y++; break; } printf("%d %d",x,y); return 0; } 

Usted malinterpreta la statement de switch .

La sentencia switch compara la expresión (a menudo una variable simple) en el switch (expression) con una serie de valores constantes de tiempo de comstackción distintos en las diversas tags de case , y ejecuta el código después de esa etiqueta. Si el valor no coincide con ninguna de las tags de case explícitas, entonces se usa la etiqueta default si está presente, o se omite todo el switch si no hay una etiqueta default .

En su código, tiene var establecido en 1 . Ni el case 'x': ni el case 'y': coinciden con 1 (serían equivalentes al case 120: y el case 121: en la mayoría de los conjuntos de códigos basados ​​en ASCII), y no hay un default , por lo que se omite el switch , y la salida es 1 2 (no, como parece que esperaba, 2 2 ).

¿Qué es una constante de tiempo de comstackción?

Los valores en las tags de caso deben ser determinables por el comstackdor a medida que se comstack el código, y deben ser expresiones constantes. Eso significa que las expresiones en las tags de casos no pueden referirse a variables o funciones, pero pueden usar cálculos básicos en valores fijos (integrales).

Dado:

 #include  const int x = 3; // C++ compilers treat this differently enum { BIG_TIME = 60 }; #define HOURS(x) (3600 * (x)) case sin(x): // Invalid - function of a variable case x: // Invalid - variable case sin(0.0): // Invalid - function case 'x': // Valid - character constant case 'xy': // Valid but not portable case BIG_TIME: // Valid - enumeration value names are constant case HOURS(2): // Valid - expands to (3600 * (2)) which is all constant 

No puede usar variables en un case ya que los valores deben ser constantes en tiempo de comstackción. Además, su código es incorrecto, ya que 'x' y 'y' son constantes (literales) y, por lo tanto, no se refieren a las variables x e y .

el uso de ‘x’ entre comillas es en realidad usar el valor constante del código ASCII para el carácter x, que en realidad es el valor numérico 120 (según el gráfico ASCII). No utiliza la variable declarada.