Sau khi đọc tất cả các câu trả lời và một số nghiên cứu thêm, tôi nhận được một vài điều.
Case statements are only 'labels'
Trong C, theo đặc điểm kỹ thuật,
§6.8.1 Báo cáo được dán nhãn:
labeled-statement:
identifier : statement
case constant-expression : statement
default : statement
Trong C không có bất kỳ mệnh đề nào cho phép "khai báo có nhãn". Nó không phải là một phần của ngôn ngữ.
Vì thế
case 1: int x=10;
printf(" x is %d",x);
break;
Điều này sẽ không biên dịch , xem http://codepad.org/YiyLQTYw . GCC đang báo lỗi:
label can only be a part of statement and declaration is not a statement
Cũng
case 1: int x;
x=10;
printf(" x is %d",x);
break;
đây cũng không phải là biên dịch , xem http://codepad.org/BXnRD3bu . Ở đây tôi cũng nhận được lỗi tương tự.
Trong C ++, theo đặc điểm kỹ thuật,
khai báo có nhãn được cho phép nhưng không được phép dán nhãn -initialization.
Xem http://codepad.org/ZmQ0IyDG .
Giải pháp cho điều kiện như vậy là hai
Sử dụng phạm vi mới bằng cách sử dụng {}
case 1:
{
int x=10;
printf(" x is %d", x);
}
break;
Hoặc sử dụng tuyên bố giả với nhãn
case 1: ;
int x=10;
printf(" x is %d",x);
break;
Khai báo biến trước khi chuyển đổi () và khởi tạo nó với các giá trị khác nhau trong câu lệnh case nếu nó đáp ứng yêu cầu của bạn
main()
{
int x; // Declare before
switch(a)
{
case 1: x=10;
break;
case 2: x=20;
break;
}
}
Một số điều nữa với câu lệnh switch
Không bao giờ viết bất kỳ câu lệnh nào trong công tắc không phải là một phần của bất kỳ nhãn nào, bởi vì chúng sẽ không bao giờ được thực thi:
switch(a)
{
printf("This will never print"); // This will never executed
case 1:
printf(" 1");
break;
default:
break;
}
Xem http://codepad.org/PA1quYX3 .