Это остаток языка программирования C. В C switch
это немного больше, чем немного синтаксического сахара над goto
в зависимости от значения выражения, и, таким образом, выполнение просто переходит к соответствующему case
и продолжается оттуда. Метки между ними точно такие: метки.Они являются точками перехода, но не влияют на поток управления в противном случае, и с точки зрения компилятора нет ничего в ярлыке, который заслуживает скачка в другом месте (кроме там, где есть INTERCAL COMEFROM
). Поэтому вы должны указать явное break
после каждого случая, когда вы не хотите перейти к другим параметрам.
Java более или менее унаследовал эти семантики, избегая некоторых of the crazier C idioms.
C# с другой стороны идет немного дальше, запрещая провал полностью на непустых ярлыках case
.
По-моему, это была небольшая ошибка дизайна. Провал по умолчанию может быть намного проще реализовать в компиляторе (потому что вам не нужно добавлять goto
в конец switch
, и он очень хорошо сочетается с тем, как все работает на самом деле), но по моему опыту значительно больше ошибок программирования, случайно используя провал, чем случайно не, используя его.
Самая серьезная ошибка дизайна в моих глазах включает в себя заявление switch
со всей его странностью на современных языках.