すべての回答といくつかの調査を読んだ後、いくつかのことがわかります。
Case statements are only 'labels'
Cでは、仕様に従って、
§6.8.1ラベル付きステートメント:
labeled-statement:
identifier : statement
case constant-expression : statement
default : statement
Cでは、「ラベル付き宣言」を許可する句はありません。言語の一部ではありません。
そう
case 1: int x=10;
printf(" x is %d",x);
break;
これはコンパイルされません。http://codepad.org/YiyLQTYwを参照してください。GCCがエラーを出している:
label can only be a part of statement and declaration is not a statement
でも
case 1: int x;
x=10;
printf(" x is %d",x);
break;
これもコンパイルされません。http://codepad.org/BXnRD3buを参照してください。ここでも同じエラーが発生します。
C ++では、仕様に従って、
ラベル付き宣言は許可されていますが、ラベル付き初期化は許可されていません。
http://codepad.org/ZmQ0IyDGを参照してください。
そのような状態への解決策は2つです
{}を使用して新しいスコープを使用する
case 1:
{
int x=10;
printf(" x is %d", x);
}
break;
または、ラベル付きのダミーステートメントを使用します
case 1: ;
int x=10;
printf(" x is %d",x);
break;
switch()の前に変数を宣言し、条件を満たしている場合は、caseステートメントで異なる値で初期化します。
main()
{
int x; // Declare before
switch(a)
{
case 1: x=10;
break;
case 2: x=20;
break;
}
}
switchステートメントでさらにいくつかのこと
ラベルの一部ではないスイッチ内のステートメントは決して実行しないでください。
switch(a)
{
printf("This will never print"); // This will never executed
case 1:
printf(" 1");
break;
default:
break;
}
http://codepad.org/PA1quYX3を参照してください。