Ich habe mich gefragt , ob die if-else - Anweisungen, wie eine switch - Anweisung ist , das tut eine Pause Äußerung.
if( boolean_expression_1 )
statement_1
else if( boolean_expression_2 )
statement_2
else
default_statement
Ist das gleiche wie:
switch( controlling_expression )
{
case: ( boolean_expression_1 )
{
statement_1
break;
}
case: ( boolean_expression_2 )
{
statement_2
break;
}
default:
{
default_statement
}
java
switch-statement
Chris Okyen
quelle
quelle
Antworten:
Das ist rückwärts. So'ne Art.
Eine if, else if, ... else-Sequenz, in der alle Tests einfache Gleichheitstests für dieselbe Variable des Formulars sind
(variable == value)
oder((variable == value1) || (variable == value2) ...)
in eine switch-Anweisung für diese Variable konvertiert werden können. Die(variable == value)
Tests werdencase value:
und der Körper desif
(oderelse if
) wird zum Körper des Falls, aber Sie müssenbreak
am Ende des Fallkörpers eine Anweisung hinzufügen . Die((variable == value1) || (variable == value2) ...)
Tests werden zu einer Folge von Fällen der Formcase value1: case value2: ... case valuen:
Eine if-Folge mit komplexeren Tests unterscheidet sich im Allgemeinen von einer switch-Anweisung.Wenn jeder Fall in einer switch-Anweisung mit endet
break
, kann diese switch-Anweisung immer als if-, else if, ... -Sequenz umgeschrieben werden. Diese Umwandlung von einem Wechsel in eine if-Sequenz ist auch möglich, wenn das Durchfallen auf Dinge wiecase A: case B: ... case N: do_something(); break;
Fall Through beschränkt ist, bei denen ein nicht leerer Körper in einen anderen nicht leeren Körper durchfällt, und nicht direkt in eine if-Sequenz konvertierbar ist.quelle
Obwohl es für einen neuen Programmierer eine hilfreiche Abstraktion ist, einen if-else-Block als eine switch-Anweisung ohne Unterbrechung zu betrachten, ist dies kein perfekter Vergleich.
Switch ist wahrscheinlich enger mit "goto" verwandt. Zugegeben, Java hat kein Springen, aber die Sprache wurde auf Ideen aus anderen Sprachen wie C aufgebaut. Die Bezeichnungen "case" und "default" unterscheiden sich nicht wirklich von anderen Sprungzielen für eine goto-Anweisung. Das erwartete Verhalten besteht also darin, die nächste Codezeile innerhalb des Blocks weiter auszuführen (die gesamte switch-Anweisung ist der Block). . Dies wird in einer der Antworten auf eine verwandte Frage weiter erläutert: Warum müssen wir Break-In-Schalter verwenden? Wir haben also den Fall, dass Sie eine break-Anweisung benötigen, um Ihrem Programm mitzuteilen, dass Sie mit der Ausführung dieses Blocks fertig sind. Sie können break in anderen Arten von Anweisungen verwenden, z. B. eine for- oder while-Schleife.
In Sprachen wie Java, die Kurzschlüsse verwenden, werden in einem if-elseif-else-Block die else if- und else-Blockbedingungen nicht ausgewertet, wenn die Bedingung für den ersten Fall der if-Anweisung wahr ist. Nach einem if wird erwartet, dass Sie entweder einen Codeblock in Klammern {} oder eine einzelne Anweisung finden. Per Definition bedeutet sonst "anders" oder dass die vorherige Bedingung nicht wahr ist, es wäre ein bisschen widersprüchlich, den Code durchfallen zu lassen.
quelle
Programmiersprachen bieten häufig viele verschiedene Konstrukte, mit denen Sie ähnliche Logik mit unterschiedlicher Syntax ausdrücken können.
if
/else
Aussagen "fallen" nicht bedingungslos miteinander durch; Das Schlüsselwort else verhindert, dass weitereelse-if
Bedingungen ausgewertet werden,break
sobald Sie am Ende eines Fallblocks aus einem Schalter aussteigen. Wenn Sie jedoch eine Reihe von eigenständigen Bedingungenif
(ohne Verwendungelse
) erstellen, wird jedeif
Bedingung für sich ausgewertet.Umgekehrt führt das Entfernen des
break
Schlüsselworts vom Ende Ihrercase
Blöcke dazu, dass der Ausführungsfluss bedingungslos zum nächsten Fall weitergeht, bis entweder eine Unterbrechung / Rückgabe / Goto auftritt oder das Ende des Schaltblocks erreicht ist.Es gibt (selten) Situationen, in denen das Durchfallen von Schaltkästen als nützlich angesehen wird. Es ist jedoch üblicher und normalerweise idiomatischer, wenn jeder Fallblock für sich behandelt werden soll.
if-else
undswitch-case
sind beide Konstrukte, mit denen Sie Auswahl (Entscheidungsfindung) in einer Programmiersprache ausdrücken können; Manchmal hängt die Wahl zwischen den beiden vom persönlichen Stil ab, manchmal gibt es zwingende Gründe, sich für eine andere zu entscheiden. Eine ähnliche Wahl gibt es, wenn Sie für -vs- wählen, während Sie Wiederholungen ausdrücken.quelle
Die Antwort lautet nein - die if-Anweisung ist nicht wie eine switch-Anweisung ohne Unterbrechung. Beginnen wir mit diesem Teil Ihrer Frage:
Wir können die Antwort mit diesem Programm finden. Der Trick ist, dass wir eine Methode als unseren booleschen Ausdruck aufrufen und System.out.println () verwenden, um zu sehen, ob die Methode ausgeführt wird. Auf diese Weise wissen wir, ob der Ausdruck ausgewertet wurde. Hier ist das Programm:
Sie werden sehen, dass der zweite boolesche Ausdruck nicht ausgewertet wird. Dieses Verhalten wird wahrscheinlich verständlicher, wenn Sie einige Klammern setzen (was in den meisten Fällen eine gute Angewohnheit ist):
Auf diese Weise zeigt der Compiler Ihre ursprüngliche if-Kette an. Wie Sie jetzt sehen können, ist das zweite "if" eine einzelne Anweisung für sich und befindet sich als solche nicht auf derselben Ebene wie die erste if-Anweisung. Wenn Sie mehr if-Anweisungen verketten, werden diese noch tiefer verschachtelt.
Sie haben auch gefragt, warum die switch-Anweisung eine break-Anweisung benötigt. Dies liegt daran, dass die switch-Anweisung nicht intern mit einer Kette von if-Anweisungen implementiert wird (und die if-Anweisung basiert auch nicht auf switch-Anweisungen). Das könnte man erwarten
wird vom Compiler in etwas übersetzt wie:
Das ist nicht der Fall. Stattdessen wird eine versteckte Skip-Anweisung verwendet:
Die Methode numberOfStatementsToSkipFor () gibt 0 für 42, 1 für 43 und 2 für alles andere zurück. Jetzt wird klar, warum dieses Programm produzieren könnte
oder
oder nur
aber nie
ohne das 'z'. Aber natürlich wäre es schön, wenn wir das schaffen könnten. Und wir können break verwenden, das in eine andere Skip-Anweisung übersetzt wird. Also, wenn Sie alle Fallzweige unterbrechen
Der Compiler erstellt Folgendes:
quelle
Um die bearbeitete Frage zu beantworten (mit den Pausen)
Sie würden die Anweisungen genau dann gleich bewerten, wenn die Bedingungen für die Eingabe jedes Blocks gleich sind.
Um die subjektive Frage zu beantworten, von
Der Vergleich der beiden lenkt Sie von dem ab, was jeder schnell ausdrücken soll.
A
switch
zentralisiert den Vergleich syntaktisch, sodass Sie den Ablauf anhand seiner Fälle verfolgen können.Während a
if
eine einzelne Bedingung zum Eingeben eines Blocks beschreibt.Grundsätzlich "liest" der Code nur anders.
Zum Beispiel haben Sie ein
word
im Kopf und möchten es im Wörterbuch nachschlagen.Ein Schalter würde lauten: Halten Sie den Startbuchstaben in Ihrem Kopf und blättern Sie dann durch das Alphabet. Geben Sie dann auf, wenn er nicht mit diesem Buchstaben beginnt.
Während eine Reihe von if-else-Blöcken lauten würde: Beginnt das Wort mit einem Buchstaben? viele Male wiederholt, dann aufgeben.
Wenn Sie versuchen, einem neuen Programmierer zu erklären, wie ein Switch funktioniert (der mit if-Blöcken vertraut ist, ist es möglicherweise einfacher, ihn wie folgt zu erklären:
Das vorstehende Beispiel bricht nun das, was normalerweise in Schulen gelehrt wird, aber die frühzeitige Rückkehr und die Rückkehr sind oft einfacher zu lesen und in einem stapelbasierten VM genauso schnell.
Es sollte Optimierungen für das Einschalten von Grundelementen geben, daher sollte die Auswahl des zu verwendenden Blocks davon abhängen, was Sie vergleichen.
Denken Sie daran, dass lange
switch
und aussagekräftigeif
Aussagen in der Regel sehr ausführlich und schwer zu pflegen sind und sich auch in der Leistung verschlechtern, da mehr Bedingungen überprüft werden müssten.Möglicherweise möchten Sie eine
Hash
anonyme Klasse / Funktion oder ein Befehlsmuster anstelle langwieriger Steuerblöcke mit vielen Bedingungen in Betracht ziehen .Hashes und Befehlsmuster ermöglichen eine schnellere Ausführung des Codes und verbessern die Wartbarkeit des Codes.
quelle