Я читал, почему мы должны использовать break
в switch
? и это заставило меня задуматься, почему неявный переход разрешен в некоторых языках (таких как PHP и JavaScript), в то время как нет поддержки (AFAIK) для явного перехода.
Это не continue
значит, что нужно было бы создать новое ключевое слово, как это было бы совершенно уместно, и это решило бы любые вопросы двусмысленности относительно того, намеревался ли автор довести дело до конца.
В настоящее время поддерживаемая форма:
switch (s) {
case 1:
...
break;
case 2:
... //ambiguous, was break forgotten?
case 3:
...
break;
default:
...
break;
}
Принимая во внимание, что имеет смысл записать это как:
switch (s) {
case 1:
...
break;
case 2:
...
continue; //unambiguous, the author was explicit
case 3:
...
break;
default:
...
break;
}
Для целей этого вопроса давайте проигнорируем вопрос о том, являются ли провалы хорошим стилем кодирования.
Существуют ли какие-либо языки, которые допускают провал и сделали это явным?
Существуют ли какие-либо исторические причины, которые switch
допускают явный провал вместо явных?
switch-statement
zzzzBov
источник
источник
goto case
, поэтому предпосылка вашего вопроса несколько ошибочна.goto case
в C #.goto case
, как упоминает pdr.Ответы:
Это в первую очередь историческое, большинство языков просто скопировали то, что сделал С.
Причина, по которой C сделал это таким образом, заключается в том, что создатели C предполагали, что операторы switch легко оптимизировать в таблицу переходов. Это также причина того, что C ограничивает операторы switch интегральными значениями.
В таблице переходов программа рассчитает, на какую позицию перейти, основываясь на выражении. Программа перейдет к этой точке, а затем продолжит выполнение с этой точки. Если вы хотите пропустить оставшуюся часть таблицы, вы должны включить переход к концу таблицы. C использует явные
break
утверждения, так что есть прямое соответствие этой конструкции.источник
break
и только менее 3% были провальными. , Затем он использовал это в качестве примера того, что стандартное поведение сброса является нелогичным и было бы лучше быть обратным (используйте ключевое слово для обозначения явного перехода). О, и книга действительно хороша для объяснения других странностей C, некоторые из которых можно найти в C ++ и даже в C # и Java! Это все коренится в B и BCPL. :)case
, отличному от первого, был автоматически добавлен префиксbreak
, а для помеченного+case
(или какого-либо другого такого обозначения) - нет. Это было бы легко для компилятора и позволило бы использовать семантические преимущества существующей схемы, исключая при этом множество строк кода.Go допускает явное падение с помощью
fallthrough
ключевого слова (break неявный, но может быть явным):Вот соответствующий бит от эффективного go и спецификации языка .
Я не думаю, что вы можете использовать,
goto
чтобы перейти к конкретному случаю, но вы можете сделать ярлык внутри корпуса и использоватьgoto
как обычно.В качестве бонуса Go позволяет вам использовать бинарные выражения, строки или типы в переключателе в качестве операторов case.
источник