Многие ответы, кажется, сосредоточены на способности провалиться как на причине требования break
утверждения.
Я считаю, что это была просто ошибка, во многом из-за того, что при разработке C не было такого большого опыта в использовании этих конструкций.
Питер Ван дер Линден приводит доводы в своей книге «Экспертное программирование на языке Си»:
Мы проанализировали исходные тексты компилятора Sun C, чтобы увидеть, как часто использовались провалы по умолчанию. Передняя часть компилятора Sun ANSI C имеет 244 оператора переключения, каждый из которых имеет в среднем семь случаев. Падение происходит всего в 3% всех этих случаев.
Другими словами, нормальное поведение переключателя неверно в 97% случаев. Дело не только в компиляторе - напротив, там, где в этом анализе использовался провал, это часто было для ситуаций, которые чаще возникают в компиляторе, чем в другом программном обеспечении, например, при компиляции операторов, которые могут иметь один или два операнда. :
switch (operator->num_of_operands) {
case 2: process_operand( operator->operand_2);
case 1: process_operand( operator->operand_1);
break;
}
Провал кейса настолько широко признан как дефект, что существует даже специальное соглашение о комментариях, показанное выше, в котором говорится, что lint «это действительно один из тех 3% случаев, когда провал был желательным».
Я думаю, что для C # было хорошей идеей требовать явного оператора перехода в конце каждого блока case (при этом позволяя складывать несколько меток case - до тех пор, пока существует только один блок операторов). В C # один случай может переходить в другой - вам просто нужно сделать это явным, перейдя к следующему случаю с помощью файла goto
.
Жаль, что Java не воспользовалась возможностью вырваться из семантики C.