Muchas respuestas parecen centrarse en la capacidad de fracasar como la razón para requerir la break
declaración.
Creo que fue simplemente un error, debido en gran medida a que cuando se diseñó C no había tanta experiencia sobre cómo se usarían estas construcciones.
Peter Van der Linden expone el caso en su libro "Expert C Programming":
Analizamos las fuentes del compilador Sun C para ver con qué frecuencia se usaba la falla predeterminada. El front-end del compilador Sun ANSI C tiene 244 instrucciones de cambio, cada una de las cuales tiene un promedio de siete casos. La caída ocurre en solo el 3% de todos estos casos.
En otras palabras, el comportamiento normal del interruptor es incorrecto el 97% del tiempo. No es solo en un compilador, por el contrario, cuando se utilizó la falla en este análisis, a menudo fue para situaciones que ocurren con más frecuencia en un compilador que en otro software, por ejemplo, cuando compila operadores que pueden tener uno o dos operandos :
switch (operator->num_of_operands) {
case 2: process_operand( operator->operand_2);
/* FALLTHRU */
case 1: process_operand( operator->operand_1);
break;
}
La omisión de casos es tan ampliamente reconocida como un defecto que incluso hay una convención de comentarios especial, que se muestra arriba, que le dice a la pelusa "este es realmente uno de esos 3% de los casos en que se deseaba la falla".
Creo que fue una buena idea que C # requiriera una declaración de salto explícita al final de cada bloque de casos (al tiempo que permite que se apilen varias etiquetas de casos, siempre y cuando solo haya un bloque de declaraciones). En C # todavía puede hacer que un caso se caiga a otro, solo tiene que hacer que la caída sea explícita saltando al siguiente caso usando a goto
.
Es una lástima que Java no aprovechó la oportunidad para romper con la semántica de C.