Después de leer todas las respuestas y un poco más de investigación, obtengo algunas cosas.
Case statements are only 'labels'
En C, según la especificación,
§6.8.1 Declaraciones etiquetadas:
labeled-statement:
identifier : statement
case constant-expression : statement
default : statement
En C no hay ninguna cláusula que permita una "declaración etiquetada". Simplemente no es parte del lenguaje.
Entonces
case 1: int x=10;
printf(" x is %d",x);
break;
Esto no se compilará , consulte http://codepad.org/YiyLQTYw . GCC está dando un error:
label can only be a part of statement and declaration is not a statement
Incluso
case 1: int x;
x=10;
printf(" x is %d",x);
break;
esto tampoco se está compilando , consulte http://codepad.org/BXnRD3bu . Aquí también recibo el mismo error.
En C ++, según la especificación,
etiquetada-declaración está permitida pero etiquetada -inicialización no está permitida.
Ver http://codepad.org/ZmQ0IyDG .
La solución a tal condición es dos
Utilice un nuevo alcance con {}
case 1:
{
int x=10;
printf(" x is %d", x);
}
break;
O use una declaración ficticia con etiqueta
case 1: ;
int x=10;
printf(" x is %d",x);
break;
Declare la variable antes del modificador () e inicialícela con diferentes valores en la declaración de caso si cumple con su requisito
main()
{
int x; // Declare before
switch(a)
{
case 1: x=10;
break;
case 2: x=20;
break;
}
}
Algunas cosas más con la declaración de cambio
Nunca escriba en el switch ninguna declaración que no forme parte de ninguna etiqueta, porque nunca se ejecutará:
switch(a)
{
printf("This will never print"); // This will never executed
case 1:
printf(" 1");
break;
default:
break;
}
Ver http://codepad.org/PA1quYX3 .