Nhiều câu trả lời dường như tập trung vào khả năng vượt qua là lý do để yêu cầu break
tuyên bố.
Tôi tin rằng đó đơn giản chỉ là một sai lầm, phần lớn là do khi C được thiết kế, gần như không có nhiều kinh nghiệm về cách các cấu trúc này sẽ được sử dụng.
Peter Van der Linden đưa ra trường hợp trong cuốn sách "Expert C Lập trình":
Chúng tôi đã phân tích các nguồn trình biên dịch Sun C để xem tần suất rơi mặc định được sử dụng. Mặt trước của trình biên dịch Sun ANSI C có 244 câu lệnh chuyển đổi, mỗi câu lệnh có trung bình bảy trường hợp. Rơi qua xảy ra chỉ trong 3% của tất cả các trường hợp này.
Nói cách khác, hành vi chuyển đổi bình thường là sai 97% thời gian. Nó không chỉ trong một trình biên dịch - ngược lại, trong đó phân tích được sử dụng trong phân tích này, nó thường dành cho các tình huống xảy ra thường xuyên hơn trong trình biên dịch so với các phần mềm khác, ví dụ, khi biên dịch các toán tử có thể có một hoặc hai toán hạng :
switch (operator->num_of_operands) {
case 2: process_operand( operator->operand_2);
/* FALLTHRU */
case 1: process_operand( operator->operand_1);
break;
}
Trường hợp rơi vào trường hợp được công nhận rộng rãi như là một khiếm khuyết mà thậm chí còn có một quy ước bình luận đặc biệt, được trình bày ở trên, nói với lint "đây thực sự là một trong 3% trường hợp rơi vào trường hợp mong muốn."
Tôi nghĩ rằng C # nên yêu cầu một câu lệnh nhảy rõ ràng ở cuối mỗi khối trường hợp (trong khi vẫn cho phép nhiều nhãn trường hợp được xếp chồng lên nhau - miễn là chỉ có một khối lệnh duy nhất). Trong C #, bạn vẫn có thể có một trường hợp rơi vào trường hợp khác - bạn chỉ cần làm cho cú ngã thông qua rõ ràng bằng cách chuyển sang trường hợp tiếp theo bằng cách sử dụng a goto
.
Thật tệ khi Java không có cơ hội thoát khỏi ngữ nghĩa C.