Tüm cevapları ve biraz daha araştırmayı okuduktan sonra birkaç şey elde ederim.
Case statements are only 'labels'
C'de, spesifikasyona göre,
§6.8.1 Etiketli İfadeler:
labeled-statement:
identifier : statement
case constant-expression : statement
default : statement
C dilinde "etiketli beyan" yapılmasına izin veren herhangi bir madde yoktur. Sadece dilin bir parçası değil.
Yani
case 1: int x=10;
printf(" x is %d",x);
break;
Bu derlenmeyecektir , bkz. Http://codepad.org/YiyLQTYw . GCC bir hata veriyor:
label can only be a part of statement and declaration is not a statement
Hatta
case 1: int x;
x=10;
printf(" x is %d",x);
break;
bu da derlenmiyor , bkz. http://codepad.org/BXnRD3bu . Burada da aynı hatayı alıyorum.
C ++ 'da, spesifikasyona göre,
etiketli bildirime izin verilir, ancak etiketli-başlatmaya izin verilmez.
Bkz. Http://codepad.org/ZmQ0IyDG .
Böyle bir duruma çözüm iki
{} Kullanarak yeni kapsam kullanın
case 1:
{
int x=10;
printf(" x is %d", x);
}
break;
Veya etiketli kukla ifade kullanın
case 1: ;
int x=10;
printf(" x is %d",x);
break;
Switch () yönteminden önce değişkeni bildirin ve gereksiniminizi karşıladığında, case deyiminde farklı değerlerle başlatın
main()
{
int x; // Declare before
switch(a)
{
case 1: x=10;
break;
case 2: x=20;
break;
}
}
Switch deyimiyle ilgili bazı şeyler
Anahtarda hiçbir zaman etiketin parçası olmayan hiçbir ifade yazmayın, çünkü asla yürütülmezler:
switch(a)
{
printf("This will never print"); // This will never executed
case 1:
printf(" 1");
break;
default:
break;
}
Bkz. Http://codepad.org/PA1quYX3 .