หลังจากอ่านคำตอบทั้งหมดและค้นคว้าเพิ่มเติมฉันได้รับบางอย่าง
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
การแก้ปัญหาดังกล่าวมีสองประการ
- ใช้ขอบเขตใหม่โดยใช้ {} - 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(a)
{
    printf("This will never print"); // This will never executed
    case 1:
        printf(" 1");
        break;
    default:
        break;
}
ดูhttp://codepad.org/PA1quYX3