Здається, багато відповідей зосереджуються на здатності пропасти як причину вимагати break
заяви.
Я вважаю, що це була просто помилка, багато в чому пов'язана з тим, що коли проектувався C, не було майже такого досвіду, як використовувати ці конструкції.
Петер Ван дер Лінден говорить про це у своїй книзі "Експертне програмування на C":
Ми проаналізували джерела компілятора Sun C, щоб побачити, як часто використовувалося падіння за замовчуванням. Передній кінець компілятора Sun ANSI C має 244 заяви комутатора, кожен з яких має в середньому сім випадків. Падіння відбувається лише у 3% усіх цих випадків.
Іншими словами, нормальна поведінка комутатора неправильна 97% часу. Справа не тільки в компіляторі - навпаки, коли в цьому аналізі використовувався пропуск, це часто траплялося для ситуацій, які трапляються частіше в компіляторі, ніж в іншому програмному забезпеченні, наприклад, при складанні операторів, які можуть мати один або два операнди :
switch (operator->num_of_operands) {
case 2: process_operand( operator->operand_2);
/* FALLTHRU */
case 1: process_operand( operator->operand_1);
break;
}
Випадок випадків настільки широко визнається дефектом, що існує навіть специфічна конвенція про коментарі, показана вище, що говорить про те, що "це дійсно один із тих 3% випадків, коли провал був бажаний".
Я думаю, що для C # було б гарною ідеєю вимагати явного оператора переходу в кінці кожного блоку речей (при цьому все ж дозволяючи укладати декілька міток регістру - до тих пір, поки існує лише один блок операторів). У C # ви все ще можете перенести один випадок у інший - вам просто потрібно зробити падіння через явне, перейшовши до наступного випадку за допомогою a goto
.
Дуже погано Java не скористалася можливістю відірватися від семантики С.