Nachdem ich alle Antworten und weitere Nachforschungen gelesen habe, bekomme ich ein paar Dinge.
Case statements are only 'labels'
In C gemäß der Spezifikation,
§6.8.1 Beschriftete Aussagen:
labeled-statement:
identifier : statement
case constant-expression : statement
default : statement
In C gibt es keine Klausel, die eine "gekennzeichnete Deklaration" zulässt. Es ist einfach nicht Teil der Sprache.
Damit
case 1: int x=10;
printf(" x is %d",x);
break;
Dies wird nicht kompiliert , siehe http://codepad.org/YiyLQTYw . GCC gibt einen Fehler aus:
label can only be a part of statement and declaration is not a statement
Sogar
case 1: int x;
x=10;
printf(" x is %d",x);
break;
Dies wird auch nicht kompiliert , siehe http://codepad.org/BXnRD3bu . Hier bekomme ich auch den gleichen Fehler.
In C ++ gemäß der Spezifikation,
Die Labeled-Deklaration ist zulässig, die Labeled-Initialisierung jedoch nicht.
Siehe http://codepad.org/ZmQ0IyDG .
Die Lösung für einen solchen Zustand ist zwei
Verwenden Sie entweder einen neuen Bereich mit {}
case 1:
{
int x=10;
printf(" x is %d", x);
}
break;
Oder verwenden Sie eine Dummy-Anweisung mit Label
case 1: ;
int x=10;
printf(" x is %d",x);
break;
Deklarieren Sie die Variable vor switch () und initialisieren Sie sie mit unterschiedlichen Werten in der case-Anweisung, wenn sie Ihre Anforderung erfüllt
main()
{
int x; // Declare before
switch(a)
{
case 1: x=10;
break;
case 2: x=20;
break;
}
}
Noch ein paar Dinge mit switch-Anweisung
Schreiben Sie niemals Anweisungen in den Schalter, die nicht Teil eines Labels sind, da diese niemals ausgeführt werden:
switch(a)
{
printf("This will never print"); // This will never executed
case 1:
printf(" 1");
break;
default:
break;
}
Siehe http://codepad.org/PA1quYX3 .