Ich las Warum wir verwenden müssen break
in switch
? , und ich habe mich gefragt, warum implizites Durchfallen in einigen Sprachen (wie PHP und JavaScript) zulässig ist, während explizites Durchfallen (AFAIK) nicht unterstützt wird.
Es ist nicht so, dass ein neues Schlüsselwort erstellt werden müsste, wie continue
es vollkommen angemessen wäre, und es würde alle Unklarheiten darüber lösen, ob der Autor beabsichtigt, dass ein Fall zustande kommt.
Das derzeit unterstützte Formular lautet:
switch (s) {
case 1:
...
break;
case 2:
... //ambiguous, was break forgotten?
case 3:
...
break;
default:
...
break;
}
In der Erwägung, dass es sinnvoll wäre, geschrieben zu werden als:
switch (s) {
case 1:
...
break;
case 2:
...
continue; //unambiguous, the author was explicit
case 3:
...
break;
default:
...
break;
}
Lassen Sie uns zu Zwecken dieser Frage die Frage ignorieren, ob Fall-Throughs ein guter Codierungsstil sind oder nicht.
Gibt es Sprachen, die das Durchfallen erlauben und die es explizit gemacht haben?
Gibt es historische Gründe, switch
die implizites Durchfallen statt explizites zulassen?
switch-statement
zzzzBov
quelle
quelle
goto case
damit umgehen, sodass die Prämisse Ihrer Frage ein bisschen falsch ist.goto case
in C # nicht bekannt war .goto case
, wie pdr erwähnt.Antworten:
Es ist in erster Linie historisch, die meisten Sprachen haben nur das kopiert, was C getan hat.
Der Grund, warum C dies tat, ist, dass die Ersteller von C beabsichtigten, Switch-Anweisungen einfach in eine Sprungtabelle zu optimieren. Dies ist auch der Grund, warum C switch-Anweisungen auf ganzzahlige Werte begrenzt.
In einer Sprungtabelle berechnet das Programm anhand des Ausdrucks, zu welcher Position gesprungen werden soll. Das Programm springt zu diesem Punkt und setzt die Ausführung ab diesem Punkt fort. Wenn Sie den Rest der Tabelle überspringen möchten, müssen Sie einen Sprung zum Ende der Tabelle einfügen. C verwendet explizite
break
Anweisungen, damit eine direkte Entsprechung zu diesem Konstrukt besteht.quelle
break
und nur weniger als 3% durchgefallen sind . Anschließend verwendete er dies als Beispiel dafür, dass das standardmäßige Fall-Through-Verhalten nicht intuitiv ist und besser umgekehrt sein sollte (verwenden Sie ein Schlüsselwort, um explizites Fall-Through anzugeben). Oh, und das Buch ist wirklich großartig darin, andere Kuriositäten von C zu erklären, von denen einige auch in C ++ und sogar in C # und Java zu finden sind! Es ist alles in B und BCPL verwurzelt. :)case
, das als das erste gekennzeichnet ist, automatisch ein Präfix vorangestelltbreak
wird, denen jedoch+case
(oder einem anderen solchen Bezeichner) nicht. Das wäre für einen Compiler leicht zu handhaben gewesen und hätte die semantischen Vorteile der vorliegenden Anordnung zugelassen, während viele Codezeilen beseitigt worden wären.Go ermöglicht die explizite Verwendung des
fallthrough
Schlüsselworts break (break ist implizit, kann aber explizit sein):Hier ist das relevante Bit von Effective Go und die Sprachspezifikation .
Ich glaube nicht, dass Sie dazu verwenden können
goto
, zu einem bestimmten Fall zu wechseln, aber Sie können ein Etikett im Inneren des Falls anbringen und eingoto
normales Etikett verwenden .Als Bonus kann Go Sie binäre Ausdrücke, Strings oder verwenden Typen in einem Switch als case - Anweisungen.
quelle