Wiele odpowiedzi wydaje się skupiać się na zdolności do upadku jako na przyczynie żądania break
stwierdzenia.
Uważam, że był to po prostu błąd, głównie dlatego, że gdy projektowano C, nie było tak dużego doświadczenia w zakresie wykorzystania tych konstrukcji.
Peter Van der Linden przedstawia taki przypadek w swojej książce „Expert C Programming”:
Przeanalizowaliśmy źródła kompilatora Sun C, aby zobaczyć, jak często używany był domyślny błąd. Interfejs kompilatora Sun ANSI C ma 244 instrukcje przełączające, z których każda ma średnio siedem przypadków. Upadek występuje tylko w 3% wszystkich tych przypadków.
Innymi słowy, normalne zachowanie przełącznika jest nieprawidłowe w 97% przypadków. Nie dotyczy to tylko kompilatora - wręcz przeciwnie, tam, gdzie fall through używano w tej analizie, często dotyczyło to sytuacji, które występują częściej w kompilatorze niż w innym oprogramowaniu, na przykład podczas kompilowania operatorów, które mogą mieć jeden lub dwa operandy :
switch (operator->num_of_operands) {
case 2: process_operand( operator->operand_2);
/* FALLTHRU */
case 1: process_operand( operator->operand_1);
break;
}
Upadek przypadku jest tak powszechnie uznawany za wadę, że istnieje nawet specjalna konwencja komentarzy, pokazana powyżej, która mówi lintowi, że „jest to naprawdę jeden z tych 3% przypadków, w których upadek był pożądany”.
Myślę, że dobrym pomysłem dla C # było wymaganie jawnej instrukcji skoku na końcu każdego bloku przypadku (przy jednoczesnym umożliwieniu układania wielu etykiet przypadków - o ile istnieje tylko jeden blok instrukcji). W języku C # nadal możesz mieć jeden przypadek przechodzić do drugiego - wystarczy, że przejdziesz bezpośrednio przez przejście do następnego przypadku przy użyciu pliku goto
.
Szkoda, że Java nie skorzystała z okazji, aby zerwać z semantyką C.