Thông thường khi sử dụng một tuyên bố switch
, bạn không thể xác định và khởi tạo các biến địa phương để báo cáo kết quả hợp chất, nhưBiến cục bộ trong câu lệnh chuyển đổi phức hợp được khởi tạo khi nhãn `mặc định:` được đặt ngoài dấu ngoặc ôm?
switch (a)
{
int b = 5; /* Initialization is skipped, no matter what a is */
case 1:
/* Do something */
break;
default:
/* Do something */
break;
}
Tuy nhiên, kể từ khi tuyên bố switch
là một tuyên bố như for
hoặc while
, không có quy tắc chống lại không sử dụng câu lệnh ghép, look here for examples. Nhưng điều này có nghĩa là, một nhãn có thể được sử dụng giữa dấu ngoặc đơn đóng sau từ khóa switch
và dấu ngoặc mở.
Vì vậy, theo ý kiến của tôi, nó sẽ có thể và được phép sử dụng một tuyên bố switch
như thế này:
switch (a)
default:
{
int b = 5; /* Is the initialization skipped when a != 1? */
/* Do something for the default case using 'b' */
break;
case 1: // if a == 1, then the initialization of b is skipped.
/* Do something */
break;
}
Câu hỏi của tôi: Sản phẩm khởi nhất thiết thực hiện trong trường hợp này (a = 1!)? Từ những gì tôi biết về các tiêu chuẩn, có, nó nên được, nhưng tôi không thể tìm thấy nó trực tiếp trong bất kỳ tài liệu tôi có sẵn. Bất cứ ai có thể cung cấp một câu trả lời kết luận?
Và trước khi tôi nhận được nhận xét về hiệu ứng đó, vâng, tôi biết đây không phải là cách để lập trình trong thế giới thực. Nhưng, như mọi khi, tôi quan tâm đến ranh giới của đặc tả ngôn ngữ. Tôi không bao giờ chịu đựng được phong cách như vậy trong nhóm lập trình của tôi!
@Mat Không, đó chỉ là ý tưởng: Nhãn trong câu lệnh 'switch' có thể xuất hiện sau dấu ngoặc đơn cho đến cuối câu lệnh (thường là hợp chất), vì vậy nhãn' default: 'bên ngoài dấu ngoặc đơn sẽ là IMHO hợp pháp . Khó hiểu, vâng, chắc chắn! Nhưng không thiếu niềng răng. –
Vì vậy, bạn có hỏi liệu 'b' có hợp lệ không nếu' trường hợp 1' được lấy? Điều này thực sự không khác với 'goto foo; {int b = 5; foo: ...} '. –
Ok, điều đó chắc chắn khó hiểu ... – Mat