Многие ответы, кажется, сосредоточены на способности провалиться как причина , требующая утверждения break
.
Я полагаю, что это была просто ошибка, во многом потому, что когда был разработан C, опыта использования этих конструкций было не так много.
Питер Ван дер Линден приводит пример в своей книге «Программирование на Expert C»:
Мы проанализировали источники компилятора Sun C
чтобы увидеть, как часто падение по умолчанию
был использован. Солнце 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 # вы все равно можете сделать так, чтобы один случай падал на другой - вам просто нужно сделать явное падение, перейдя к следующему случаю, используя goto
.
Жаль, что Java не воспользовалась возможностью оторваться от семантики Си.