Bedingt (Computerprogrammierung)
Im Informatik, Bedingungen (das ist, Bedingte Aussagen, bedingte Ausdrücke und bedingte Konstrukte,) sind Programmiersprache Befehle für den Umgang mit Entscheidungen. Insbesondere führen Konditionals unterschiedliche Berechnungen oder Aktionen durch, je nachdem, ob ein Programmierer definiert ist Boolesche Bedingung bewertet zu wahr oder falsch. Bezüglich SteuerflussDie Entscheidung wird immer getroffen, indem der Kontrollfluss basierend auf einer Bedingung selektiv geändert wird (abgesehen vom Fall von Branchenprädikation).
Obwohl Dynamischer Versand wird normalerweise nicht als bedingte Konstrukt eingestuft, es ist eine weitere Möglichkeit, zwischen Alternativen bei auszuwählen Laufzeit.
Terminologie
Im Imperative Programmierung Sprachen, der Begriff "bedingt Aussage"wird normalerweise verwendet, während in Funktionelle Programmierung, die Begriffe "bedingt Ausdruck"oder" bedingte Konstrukt "werden bevorzugt, da diese Begriffe alle unterschiedliche Bedeutungen haben.
Wenn - dann (–else)
Das wenn, dann
konstruieren (manchmal genannt wenn - dann - ELSE
) ist in vielen Programmiersprachen üblich. Obwohl die Syntax von Sprache zu Sprache variiert, ist die Grundstruktur (in Pseudocode Form) sieht so aus:
Wenn (booleschen Zustand) Dann (Folge)Anders (Alternative)Ende wenn
Zum Beispiel:
Wenn Lager = 0 Dann Nachricht = neue Aktien bestellenAnders message = Es gibt AktienEnde wenn
Im obigen Beispielcode wird der Teil durch (booleschen Zustand) bildet eine bedingte Ausdruckmit intrinsischen Wert (z. B. kann er durch einen der Werte ersetzt werden WAHR
oder FALSCH
) Aber keine intrinsische Bedeutung. Im Gegensatz dazu die Kombination dieses Ausdrucks, die Wenn
und Dann
umgeben es und die danach folgenen Konsequenten bilden eine bedingte Aussage, mit intrinsische Bedeutung (z. B. eine kohärente logische Regel ausdrückt), aber keinen intrinsischen Wert.
Wenn ein Dolmetscher findet eine Wenn
, es erwartet a Boolesche Bedingung - zum Beispiel, x> 0
, was bedeutet "die Variable X enthält eine Zahl, die größer als Null ist" - und bewertet diese Bedingung. Wenn der Zustand ist Stimmt
, die Aussagen nach dem dann
werden ausgeführt. Andernfalls wird die Ausführung in der folgenden Zweigstelle fortgesetzt - entweder in der anders
Block (was normalerweise optional ist) oder wenn es keine gibt anders
Zweig, dann nach der Ende wenn
.
Nach der Ausführung einer Zweigstelle, Kontrolle kehrt nach dem zu dem Punkt zurück Ende wenn
.
Geschichte und Entwicklung
In frühen Programmiersprachen, insbesondere einige Dialekte von BASIC in den 1980er Jahren Heimcomputer, ein wenn, dann
Aussage konnte nur enthalten GEHE ZU
Aussagen (entspricht a Zweig Anweisung). Dies führte zu einem schwer lesenden Programmstil, der als bekannt ist Spaghetti -Programmierung, mit Programmen in diesem Stil genannt Spaghetti -Code. Als Ergebnis, Strukturierte Programmierung, damit (praktisch) beliebige Anweisungen in Anweisungsblöcken in einem gegeben werden können wenn
Aussage, die immer an Popularität gewonnen wurde, bis es auch in den meisten grundlegenden Programmierkreisen zur Norm wurde. Solche Mechanismen und Prinzipien basierten auf dem älteren, aber fortgeschritteneren Algol Sprachenfamilie und algolähnliche Sprachen wie z. Pascal und Modula-2 Beeinflussen moderne Grundvarianten für viele Jahre. Während es nur bei Verwendung möglich ist GEHE ZU
Aussagen in wenn, dann
Aussagen zum Schreiben von Programmen, die kein Spaghetti -Code sind und genauso gut strukturiert und lesbar sind wie Programme, die in einer strukturierten Programmiersprache geschrieben wurden. Strukturierte Programmierung erleichtert dies und erzwingt dies. Strukturiert wenn - dann - ELSE
Aussagen wie das obige Beispiel sind eines der Schlüsselelemente der strukturierten Programmierung, die in den beliebtesten hochrangigen Programmiersprachen wie z. B. vorhanden sind C, Java, JavaScript und Visual Basic .
Das Problem "sonst"
Das anders
Schlüsselwort wird gemacht, um einen bestimmten Ziel zu erreichen wenn, dann
Aussage vor dem Vorgehen, aber für verschachtelt wenn, dann
Aussagen, klassische Programmiersprachen wie z. Algol 60 Ich habe Mühe zu definieren, welche spezifische Aussage zu zielen. Ohne klare Grenzen für welche Aussage welche ist, was, und anders
Schlüsselwort könnte auf alle vorhergehenden Ziele abzielen wenn, dann
Aussage im Nest, wie analysiert.
wenn a dann wenn b dann s anders S2
kann als analysiert werden
wenn a dann (wenn b dann s) anders S2
oder
wenn a dann (wenn b dann s anders S2)
je nachdem, ob die anders
ist mit dem ersten verbunden wenn
oder zweitens wenn
. Dies ist als die bekannt sonst baumeln Problem und wird je nach Sprache auf verschiedene Weise gelöst (üblich über die Ende wenn
Aussage oder {...}
Klammern).
Sonst wenn
Durch die Nutzung sonst wenn
Es ist möglich, mehrere Bedingungen zu kombinieren. Nur die Aussagen, die nach der ersten Bedingung, die sich als wahr befindet, werden ausgeführt. Alle anderen Aussagen werden übersprungen.
wenn Bedingung dann - Aussagen elseif Bedingung dann - Weitere Aussagen elseif Bedingung dann - mehr Aussagen; ...anders - Andere Aussagen; Ende wenn;
Zum Beispiel für ein Geschäft, das bis zu 30% Rabatt für einen Artikel bietet:
wenn Rabatt <11% dann Druck (Sie müssen 30 $ zahlen)elseif Rabatt <21% dann Druck (Sie müssen 20 $ zahlen)elseif Rabatt <31% dann Druck (Sie müssen 10 $ zahlen)Ende wenn;
Wenn der Rabatt 10%beträgt, wird im obigen Beispiel die erste, wenn die Erklärung als wahr bewertet wird und "Sie müssen 30 US -Dollar zahlen" ausgedruckt. Alle anderen Aussagen unten, wenn die Anweisung übersprungen wird.
Das elseif
Aussage in der Ada Sprache zum Beispiel ist einfach syntethischer Zucker zum anders
gefolgt von wenn
. In ADA ist der Unterschied, dass nur einer Ende wenn
wird benötigt, wenn man verwendet elseif
Anstatt von anders
gefolgt von wenn
. Php verwendet die elseif
Stichwort[1] sowohl für seine lockigen Klammern als auch für die Dickdarmsyntaxe. Perl Bietet das Schlüsselwort Elsif
Um die große Anzahl von Zahnspangen zu vermeiden, die von mehreren benötigt werden wenn
und anders
Aussagen. Python Verwendet das spezielle Schlüsselwort elif
Weil die Struktur eher durch Einrückung als durch Klammern bezeichnet wird, also eine wiederholte Verwendung von anders
und wenn
würde nach jeder Erkrankung eine erhöhte Einkerbung erfordern. Einige Implementierungen von BASIC, wie zum Beispiel Visual Basic,[2] verwenden Elseif
zu. In ähnlicher Weise haben sich die früheren Unix -Shells (später bis zur POSIX -Shell -Syntax versammelt[3]) Verwenden Sie auch ELIF, aber geben Sie die Auswahl der Abgrenzung mit Räumen, Linienbrüchen oder beides.
In vielen Sprachen stammten jedoch direkter von Algol ab, wie z. Simula, Pascal, BCPL und Cdiese spezielle Syntax für die sonst wenn
Das Konstrukt ist weder vorhanden, noch ist es in den vielen syntaktischen Derivaten von C vorhanden, wie z. Java, ECMaskript, usw. Dies funktioniert, weil in diesen Sprachen alle Single Aussage (in diesem Fall Wenn
...) kann einem Bedingung folgen, ohne in einen Block eingeschlossen zu werden.
Diese Designauswahl hat einen leichten "Kosten". Jeder sonst wenn
Zweig fügt effektiv ein zusätzliches Nistniveau hinzu. Dies kompliziert den Job für den Compiler (oder die Personen, die den Compiler schreiben), da der Compiler willkürlich lang analysieren und umsetzen muss sonst wenn
Ketten rekursiv.
Wenn alle Begriffe in der Abfolge von Bedingungen den Wert eines einzelnen Expression testen (z. B.,,, Wenn x = 0
... sonst wenn x = 1
... sonst wenn x = 2
...), eine Alternative ist die Schaltanweisung, auch als Fallbeamte oder ausgewählte Statement bezeichnet. Umgekehrt können diese in Sprachen, die keine Switch -Anweisung haben, durch eine Abfolge von erzeugt werden sonst wenn
Aussagen.
Wenn - ELSE -Ausdrücke
Viele Sprachen unterstützen Wenn Ausdrücke, die ähnlich sind, wenn Aussagen, aber als Ergebnis einen Wert zurückgeben. Sie sind also echte Ausdrücke (die zu einem Wert bewertet werden) und keine Aussagen (die im Kontext eines Wertes möglicherweise nicht zulässig sind).
Algol -Familie
Algol 60 und einige andere Mitglieder der Algol Familie erlauben wenn - dann - ELSE
als Ausdruck:
myVariable: = wenn x> 20 dann 1 sonst 2
Lisp -Dialekte
In Dialekten von Lispeln – Planen, Schläger und Common Lisp - Der erste von Algol wurde in hohem Maße inspiriert:
;; Planen (definieren myvariable (wenn (> x 12) 1 2)) ; Weist je nach Wert von 'x' 'myVariable' 1 oder 2 zu, je nach Wert von 'x'
;; Common Lisp (Lassen ((x 10)) (setQ myvariable (wenn (> x 12) 2 4))) ; Weist 2 'myvariable' zu 2 zu
Haskell
Im Haskell 98 gibt es nur eine Wenn Ausdruck, nein wenn Anweisung, und die anders
Teil ist obligatorisch, da jeder Ausdruck einen gewissen Wert haben muss.[4] Logik, die mit Bedingungen in anderen Sprachen ausgedrückt wird Musteranpassung in rekursiven Funktionen.
Weil Haskell ist faulEs ist möglich, Kontrollstrukturen zu schreiben, wie z. wennals gewöhnliche Ausdrücke; Die faule Bewertung bedeutet, dass eine Wenn Funktion kann nur den Zustand und den richtigen Zweig bewerten (wo eine strenge Sprache alle drei bewerten würde). Es kann so geschrieben werden:[5]
wenn' :: Bool -> a -> a -> a wenn' WAHR x _ = x wenn' FALSCH _ y = y
C-ähnliche Sprachen
C und c-ähnliche Sprachen haben eine besondere ternärer Operator (?:) für bedingte Ausdrücke mit einer Funktion, die durch eine solche Vorlage beschrieben werden kann:
Bedingung ? ausgewertet-wenn es ist, wenn es um ist: bewertet-wenn es umsetzt wird
Dies bedeutet, dass es in C-ähnliche Sprachen in Ausdrücke eingebaut werden kann:
my_variable = x > 10 ? "Foo" : "Bar"; // in c-ähnlichen Sprachen
die mit der Algolfamilie verglichen werden kann, wenn-dann-ELSE Ausdrücke (im Gegensatz zu a Aussage) (und ähnlich in Ruby und Scala).
Um dasselbe mit einem If-Statement zu erreichen, dauert dies mehr als eine Codezeile (unter typischen Layoutkonventionen) und erfordert zweimal "my_variable": "my_variable":
wenn (x > 10) my_variable = "Foo"; anders my_variable = "Bar";
Einige argumentieren, dass die explizite wenn/dann leichter zu lesen ist und dass sie zu einem effizienteren Code kompiliert werden kann als der ternäre Operator.[6] Während andere argumentieren, dass präzise Ausdrücke leichter zu lesen sind als Aussagen, die sich über mehrere Zeilen ausbreiten, die Wiederholungen enthalten.
Kleine Basic
x = Textwindow.Readnumber() Wenn (x > 10) Dann Textwindow.Schreiben("Meine Variable heißt 'Foo'.") Anders Textwindow.Schreiben("Meine Variable heißt" Bar ".") Endif
Wenn der Benutzer das Programm ausführt, erscheint ein Cursor, der darauf wartet, dass der Leser eine Nummer eingibt. Wenn diese Zahl größer als 10 ist, heißt der Text "Meine Variable heißt" Foo ". wird auf dem Bildschirm angezeigt. Wenn die Zahl kleiner als 10 ist, wird die Nachricht "Meine Variable" Bar "bezeichnet. wird auf dem Bildschirm gedruckt.
Visual Basic
Im Visual Basic und einige andere Sprachen, eine Funktion genannt Iif
wird zur Verfügung gestellt, die als bedingter Ausdruck verwendet werden kann. Es verhält sich jedoch nicht wie ein wahrer bedingter Ausdruck, da sowohl die wahren als auch die falschen Zweige immer bewertet werden; Es ist nur so, dass das Ergebnis eines von ihnen weggeworfen wird, während das Ergebnis des anderen durch die IIF -Funktion zurückgegeben wird.
Tcl
Im Tcl wenn
ist kein Schlüsselwort, sondern eine Funktion (in TCL, die als Befehl oder als Befehl bekannt ist Proc
). Zum Beispiel
wenn {$ x > 10} { stellt "Foo!" }
ruft eine Funktion namens auf wenn
2 Argumente bestehen: Der erste ist der Zustand und der zweite der wahre Zweig. Beide Argumente werden als Saiten übergeben (in TCL alles in lockigen Klammern ist eine Zeichenfolge).
Im obigen Beispiel wird die Bedingung vor dem Aufrufen der Funktion nicht bewertet. Stattdessen die Implementierung der wenn
Die Funktion empfängt die Bedingung als Zeichenfolgenwert und ist dafür verantwortlich, diese Zeichenfolge als Ausdruck im Callers -Bereich zu bewerten.[7]
Ein solches Verhalten ist durch Verwendung möglich Uplevel
und Expr
Befehle:
- Uplevel ermöglicht es, neue Steuerungskonstrukte als TCL -Verfahren zu implementieren (zum Beispiel könnte Uplevel verwendet werden, um das While -Konstrukt als TCL -Verfahren zu implementieren).[8]
Da wenn
Ist tatsächlich eine Funktion, die auch einen Wert zurückgibt:
- Der Rückgabewert des Befehls ist das Ergebnis des Körperskripts, das ausgeführt wurde, oder einer leeren Zeichenfolge, wenn keiner der Ausdrücke ungleich Null war und es keine Karosserie gab.[9]
Rost
Im Rost, wenn
ist immer ein Ausdruck. Es bewertet den Wert des Zweigs, der ausgeführt wird, oder zum Einheitstyp ()
Wenn keine Filiale ausgeführt wird. Wenn ein Zweig keinen Rückgabewert liefert, bewertet er sich an ()
standardmäßig. Um die zu gewährleisten wenn
Der Typ des Ausdrucks ist zur Kompilierungszeit bekannt. Jeder Zweig muss einen Wert desselben Typs bewerten. Aus diesem Grund eine anders
Der Zweig ist effektiv obligatorisch, es sei denn, die anderen Zweige bewerten zu ()
, weil an wenn
ohne ein anders
kann immer bewerten zu ()
standardmäßig.[10]
// my_variable einen Wert zuweisen, abhängig vom Wert von x Lassen my_variable = wenn x > 20 { 1 } anders { 2 }; // Diese Variante wird nicht kompilieren, da 1 und () unterschiedliche Typen haben Lassen my_variable = wenn x > 20 { 1 }; // Werte können weggelassen werden, wenn sie nicht benötigt werden wenn x > 20 { println!("X ist größer als 20"); }
Arithmetik wenn
Bis zu Forran 77, Die Sprache, die Forran hat eine "Arithmetic If" -Schürt Trichotomie x < 0, x = 0,, x > 0. Dies war die früheste bedingte Aussage in Forran:[11]
WENN (e) Label1, Label2, Label3
Wo E ein numerischer Ausdruck ist (nicht unbedingt eine Ganzzahl); Dies entspricht zu
WENN (e .Lt. 0) GEHE ZU Label1 WENN (e .Gl. 0) GEHE ZU Label2 GEHE ZU Label3
Weil das Arithmetik wenn ist äquivalent zu mehreren GEHE ZU
Aussagen, die überall springen könnten, wird als unstrukturierte Steuererklärung angesehen und sollte nicht verwendet werden, wenn strukturiertere Aussagen verwendet werden können. In der Praxis wurde beobachtet, dass die meisten arithmetischen WENN
Aussagen bezog sich auf die folgende Erklärung mit einem oder zwei der Etiketten.
Dies war die einzige bedingte Kontrollanweisung in der ursprünglichen Implementierung von FORTRAN auf der IBM 704 Computer. Auf diesem Computer hatte der Test-und-Branch-OP-Code drei Adressen für diese drei Staaten. Andere Computer hätten "Flag" Register wie positiv, null, negativ, gleichmäßig, überlaufen, tragen, mit den letzten arithmetischen Operationen verbunden und würden Anweisungen wie "Zweig, wenn Akkumulator negativ" verwenden "Zweig, wenn Akkumulator Null" oder ähnlich. Beachten Sie, dass der Ausdruck bewertet wird nur einmalund in Fällen wie ganzzahliger Arithmetik, bei denen Überlauf auftreten kann, würden auch der Überlauf oder die Tragflaggen in Betracht gezogen.
Objektorientierte Implementierung in SmallTalk
Im Gegensatz zu anderen Sprachen in Smalltalk Die bedingte Aussage ist nicht a Sprachkonstrukt aber in der Klasse definiert Boolesche
als abstrakte Methode, die zwei Parameter annimmt, beide Schließungen. Boolesche
hat zwei Unterklassen, WAHR
und FALSCH
, die beide die Methode definieren, WAHR
Nur die erste Schließung ausführen, FALSCH
Nur die zweite Schließung ausführen.[12]
var = Bedingung Wenn wahr: [ "Foo" ] Iffalse: [ 'Bar' ]
JavaScript
JavaScript Verwendet IF-ELSE-Aussagen ähnlich denen in C Sprachen oder ähnlich. Ein boolescher Wert wird innerhalb von Klammern zwischen dem reservierten akzeptiert wenn Schlüsselwort und eine linke lockige Klammer.
wenn (Mathematik.zufällig() < 0,5) { Konsole.Protokoll("Du hast Köpfe!"); } anders { Konsole.Protokoll("Du hast Schwänze!"); }
Das obige Beispiel nimmt die Bedingung von Math.random () <0,5
welche Ausgänge Stimmt
Wenn ein zufälliger Float -Wert zwischen 0 und 1 größer als 0,5 ist. In der Anweisung wählt sie zufällig zwischen Ausgangsausgabe Du hast Köpfe!
oder Du hast Schwänze!
zur Konsole. Ansonsten und sonst können auch Aussagen nach der lockigen Klammer der Aussage so oft wie nötig gekettet werden, wie unten gezeigt:
var x = Mathematik.zufällig(); wenn (x < 1/3) { Konsole.Protokoll("Eine Person hat gewonnen!"); } anders wenn (x < 2/3) { Konsole.Protokoll("Zwei Leute haben gewonnen!"); } anders { Konsole.Protokoll("Es ist eine Drei-Wege-Krawatte!"); }
Lambda -Kalkül
Im Lambda -KalkülDas Konzept einer if-then-else-Bedingung kann unter Verwendung der Ausdrücke ausgedrückt werden:
true = λx. λy. x false = λx. λy. y ifthenelse = (λc. λx. λy. (c x y))
- True nimmt bis zu zwei Argumente und sobald beide bereitgestellt werden (siehe Currying), es gibt das erste angegebene Argument zurück.
- False nimmt bis zu zwei Argumente und sobald beide bereitgestellt werden (siehe Currying), es gibt das zweite angegebene Argument zurück.
- Iftenelse nimmt bis zu drei Argumente ein und sobald alle bereitgestellt werden, übergibt es sowohl das zweite als auch das dritte Argument an das erste Argument (was eine Funktion ist, die zwei Argumente angegeben und ein Ergebnis erzielt). Wir gehen davon aus, dass sie als Argument nur wahr oder falsch annehmen, dass beide die angegebenen zwei Argumente an ihre bevorzugten einzelnen Argumente projizieren, die dann zurückgegeben wird.
Hinweis: Wenn iFthenelse zwei Funktionen als linke und rechte Bedingungen übergeben wird; es ist notwendig Um auch ein leeres Tuple () an das Ergebnis von Ithenelse zu übergeben, um die ausgewählte Funktion tatsächlich aufzurufen, sonst gibt Iftenelse das Funktionsobjekt zurück, ohne aufgerufen zu werden.
In einem System, in dem Zahlen ohne Definition verwendet werden können (wie LISP, herkömmliche Papiermathematik, so weiter), kann das oben genannte als einzelne Schließung unten ausgedrückt werden:
((λstrue. λFalse. λiftenelse. (iftenelse Stimmt 2 3) ) (λx. λy. x) (λx. λy. y) (λc. λl. λr. c l r))
Hier sind wahr, falsch und iFthenelse an ihre jeweiligen Definitionen gebunden, die am Ende ihres Blocks an ihren Geltungsbereich übergeben werden.
Eine funktionierende JavaScript -Analogie (unter Verwendung von nur Funktionen der einzelnen Variablen für die Strenge) ist:
var computerationResult = ((_Stimmt => _FALSCH => _Sthenelse => _Sthenelse(_Stimmt) (2) (3) ) (x => y => x) (x => y => y) (c => x => y => c(x) (y)));
Der obige Code mit multivariablen Funktionen sieht folgendermaßen aus:
var computerationResult = ((_Stimmt, _FALSCH, _Sthenelse) => _Sthenelse(_Stimmt, 2, 3) ) (((x, y) => x, (x, y) => y, (c, x, y) => c(x, y));
Eine andere Version des früheren Beispiels ohne System, in dem die Zahlen angenommen werden, finden Sie unten.
Das erste Beispiel zeigt, dass der erste Zweig genommen wird, während das zweite Beispiel zeigt, dass der zweite Zweig genommen wird.
((λstrue. λFalse. λiftenelse. (iftenelse Stimmt (λfirstbranch. Firstbranch) (λsecondbranch. Secondbranch)) ) (λx. λy. x) (λx. λy. y) (λc. λl. λr. c l r)) ((λstrue. λFalse. λiftenelse. (iftenelse FALSCH (λfirstbranch. Firstbranch) (λsecondbranch. Secondbranch)) ) (λx. λy. x) (λx. λy. y) (λc. λl. λr. c l r))
SmallTalk verwendet eine ähnliche Idee für seine wahren und falschen Darstellungen, wobei echte und falsche Singleton -Objekte, die auf Nachrichten ifstrue/iffalse anders reagieren.
Haskell verwendete früher dieses genaue Modell für seinen booleschen Typ, aber zum Zeitpunkt des Schreibens verwenden die meisten Haskell-Programme syntaktische Zucker "Wenn a dann B, sonst C" konstruieren die im Gegensatz zu iFthenelse nicht komponiert, es sei denn wie im Haskell -Abschnitt dieser Seite gezeigt.
Fall- und Schaltanweisungen
Anweisungen wechseln (In einigen Sprachen, Fallanweisungen oder Mehrzweige mit mehreren Wegen) vergleichen Sie einen bestimmten Wert mit bestimmten Konstanten und ergreifen Sie Maßnahmen gemäß der ersten Konstante, die übereinstimmt. In der Regel wird eine Standardaktion ('sonst', 'ansonsten') vorgesehen, wenn keine Übereinstimmung erfolgreich ist. Switch -Anweisungen können zulässt Compiler -Optimierungen, wie zum Beispiel Nachschlagetabellen. In dynamischen Sprachen sind die Fälle möglicherweise nicht auf konstante Ausdrücke beschränkt und können sich auf erstrecken Musteranpassungwie in der Shell-Skript Beispiel rechts, wobei das '*)' den Standardfall als impliziert regulären Ausdruck Übereinstimmung mit einer String.
Pascal: | C: | Shell-Skript: |
---|---|---|
Fall Somechar von 'a': Actionona; 'x': Actiononx; "y",'z':Actiononyandz; anders Actiononnomatch; Ende; | Schalter (Somechar) { Fall 'a': Actionona; Unterbrechung; Fall 'x': Actiononx; Unterbrechung; Fall "y": Fall 'z': Actiononyandz; Unterbrechung; Ursprünglich: Actiononnomatch; } | Fall $ somechar in a) Actionona; ;; x) Actiononx; ;; [yz])) Actiononyandz; ;; *) Actiononnomatch ;; ESAC |
Musteranpassung
Musteranpassung kann als Alternative zu beiden gesehen werden wenn - dann - ELSE, und Fall Aussagen. Es ist in vielen Programmiersprachen mit funktionalen Programmierfunktionen erhältlich Wolfram Sprache, Ml und viele andere. Hier ist ein einfaches Beispiel in der Ocaml Sprache:
passen Obst mit | "Apfel" -> Koch Kuchen | "Kokosnuss" -> Koch dango_mochi | "Banane" -> mischen;;
Die Kraft des Muster -Matchings ist die Fähigkeit zu präzise Match nicht nur Aktionen, sondern auch Werte Datenmuster. Hier ist ein Beispiel in geschrieben Haskell Dies zeigt beide Merkmale:
Karte _ [] = [] Karte f (h : t) = f h : Karte f t
Dieser Code definiert eine Funktion Karte, was das erste Argument (eine Funktion) auf jedes der Elemente des zweiten Arguments (eine Liste) anwendet und die resultierende Liste zurückgibt. Die beiden Zeilen sind die beiden Definitionen der Funktion für die beiden Arten von Argumenten, die in diesem Fall möglich sind - eine, in der die Liste leer ist (einfach eine leere Liste zurückgeben) und der andere Fall, in dem die Liste nicht leer ist.
Musteranpassung ist nicht streng genommen stets Ein Auswahlkonstrukt, da es in Haskell möglich ist, nur eine Alternative zu schreiben, die garantiert immer übereinstimmt. In dieser Situation wird sie nicht als Auswahlkonstrukt verwendet, sondern einfach als Möglichkeit, Namen an Werte zu binden. Es wird jedoch häufig als Auswahlkonstrukt in den Sprachen verwendet, in denen es verfügbar ist.
Hash-basierte Bedingungen
In Programmiersprachen, die haben assoziative Arrays oder vergleichbare Datenstrukturen wie z. Python, Perl, Php oder Ziel cEs ist idiomatisch, sie zur Implementierung einer bedingten Zuordnung zu verwenden.[13]
Haustier = Eingang("Geben Sie die Art von Haustier ein, die Sie nennen möchten:") Bekannte_Pets = { "Hund": "Fido", "Katze": "Meowles", "Vogel": "Tweety", } mein Name = Bekannte_Pets[Haustier]
In Sprachen, die haben Anonyme Funktionen oder die es einem Programmierer ermöglichen, einer variablen Referenz eine benannte Funktion zuzuweisen, kann der bedingte Fluss durch Verwendung eines Hashs als a implementiert werden Versandtabelle.
Prädikation
Eine Alternative zu den Anweisungen für bedingte Zweige ist Prädikation. Prädikation ist ein Architektur Funktionen, mit der Anweisungen bedingt ausgeführt werden können, anstatt die zu ändern Steuerfluss.
Auswahlsystem Kreuzreferenz
Diese Tabelle bezieht sich auf die neueste Sprachspezifikation jeder Sprache. Für Sprachen, die keine Spezifikation haben, wird die neueste offiziell veröffentlichte Implementierung bezeichnet.
Programmiersprache | Strukturiert, wenn | Schalter–Säure -Wäsche | Arithmetik wenn | Musteranpassung[EIN] | ||
---|---|---|---|---|---|---|
dann | anders | sonst - wenn | ||||
Ada | Ja | Ja | Ja | Ja | Nein | Nein |
Apl | Nein | Ja | Ja | Ja | Nein | Nein |
Bash Shell | Ja | Ja | Ja | Ja | Nein | Ja |
C, C ++ | Nein | Ja | nicht benötigt[B][C] | Durchfallen | Nein | Nein |
C# | Nein | Ja | Nicht benötigt[B][C] | Ja | Nein | Nein |
Cobol | Ja | Ja | Nicht benötigt[C] | Ja | Nein | Nein |
Eiffel | Ja | Ja | Ja | Ja | Nein | Nein |
F# | Ja | Ja | Ja | Nicht benötigt[D] | Nein | Ja |
Forran 90 | Ja | Ja | Ja | Ja | Ja[G] | Nein |
gehen | Nein | Ja | Nicht benötigt[C] | Ja | Nein | Nein |
Haskell | Ja | Erforderlich | Nicht benötigt[C] | Ja, aber unnötig[D] | Nein | Ja |
Java | Nein | Ja | Nicht benötigt[C] | Durchfallen[14] | Nein | Nein |
ECMaskript (JavaScript)) | Nein | Ja | Nicht benötigt[C] | Durchfallen[15] | Nein | Nein |
Mathematica | Nein | Ja | Ja | Ja | Nein | Ja |
Oberon | Ja | Ja | Ja | Ja | Nein | Nein |
Perl | Nein | Ja | Ja | Ja | Nein | Nein |
Php | Nein | Ja | Ja | Durchfallen | Nein | Nein |
Pascal, Objekt Pascal (Delphi)) | Ja | Ja | Nicht benötigt | Ja | Nein | Nein |
Python | Nein | Ja | Ja | Nein | Nein | Ja |
QuickBasic | Ja | Ja | Ja | Ja | Nein | Nein |
Rubin | Ja | Ja | Ja | Ja | Nein | Ja[H] |
Rost | Nein | Ja | Ja | Nicht benötigt | Nein | Ja |
Scala | Nein | Ja | Nicht benötigt[C] | Durchfallen | Nein | Ja |
Sql | Ja[F] | Ja | Ja | Ja[F] | Nein | Nein |
Schnell | Nein | Ja | Ja | Ja | Nein | Ja |
Tcl | Nein | Ja | Ja | Ja | Nein | Ja |
Visual Basic, klassisch | Ja | Ja | Ja | Ja | Nein | Nein |
Visual Basic .net | Ja | Ja | Ja | Ja | Nein | Nein |
Windows PowerShell | Nein | Ja | Ja | Durchfallen | Nein | Nein |
- ^ Dies bezieht sich auf das Muster -Matching als ein ausgeprägtes bedingtes Konstrukt in der Programmiersprache - im Gegensatz zu bloßer String -Muster -Matching -Unterstützung, wie z. regulären Ausdruck Unterstützung.
- 1 2 Eine #elif -Anweisung wird in der verwendet Präprozessor Unterlagern, mit der der Code vor der Kompilierung geändert wird; und zu enthalten andere Dateien.
- 1 2 3 4 5 6 Der oft beflügelte
sonst wenn
In der C -Familie der Sprachen und in Cobol und Haskell ist kein Sprachmerkmal, sondern eine Reihe von verschachtelten und unabhängigen Wenn dann noch Aussagen in Kombination mit einem bestimmten Quellcode -Layout. Dies bedeutet jedoch auch, dass in diesen Sprachen ein besonderes anderes - wenn Konstrukt nicht wirklich benötigt wird. - 1 2 In Haskell und F#ist ein separates Konstrukt konstanter Auswahl nicht benötigt, da dieselbe Aufgabe mit Musteranpassung erledigt werden kann.
- ^ In einem Rubin
Fall
konstruieren, regulären Ausdruck Die Übereinstimmung gehört zu den verfügbaren bedingten Flusskontrollalternativen. Zum Beispiel siehe Dies Stapelüberlauffrage. - 1 2 SQL hat zwei ähnliche Konstrukte, die beide Rollen erfüllen, beide eingeführt in SQL-92. A "gesucht
FALL
" AusdruckCASE WHEN cond1 THEN expr1 WHEN cond2 THEN expr2 [...] ELSE exprDflt END
funktioniert wiewenn ... sonst wenn ... sonst
während ein "einfach"FALL
" Ausdruck:CASE expr WHEN val1 THEN expr1 [...] ELSE exprDflt END
Funktioniert wie eine Switch -Anweisung. Details und Beispiele finden Sie unter Fall (SQL). - ^ Arithmetik
wenn
ist veraltet in Forran 90. - ^ Die Musteranpassung wurde in Ruby 3.0 hinzugefügt.[16] Einige Musteranpassungskonstrukte sind immer noch experimentell.
Siehe auch
- Zweig (Informatik)
- Bedingte Zusammenstellung
- Dynamischer Versand Eine andere Möglichkeit, Ausführungsentscheidungen zu treffen
- McCarthy Formalismus Für Geschichte und historische Referenzen
- Bedingung genannt
- Relationaler Operator
- Test (UNIX)
- Yoda -Bedingungen
- Bedingte Bewegung
Verweise
- ^ PHP Elseif Syntax
- ^ Visual Basic Elseif Syntax
- ^ POSIX -Standard -Shell -Syntax
- ^ Haskell 98 Sprache und Bibliotheken: Der überarbeitete Bericht
- ^ "If-Then-Else-Vorschlag zu Haskellwiki"
- ^ "Effiziente C -Tipps Nr. 6 - Verwenden Sie den ternären Operator nicht" Stack Overflow ".. Embeddedgurus.com. 2009-02-18. Abgerufen 2012-09-07.
- ^ "Neue Kontrollstrukturen". Tcler's Wiki. Abgerufen 21. August, 2020.
- ^ "Upleevel Manual Page". www.tcl.tk. Abgerufen 21. August, 2020.
- ^ "Wenn manuelle Seite". www.tcl.tk. Abgerufen 21. August, 2020.
- ^ "Wenn und wenn Sie Ausdrücke lassen". Abgerufen 1. November, 2020.
- ^ "American National Standard Programmiersprache Forran". 1978-04-03. Archiviert von das Original Am 2007-10-11. Abgerufen 2007-09-09.
- ^ "Visualworks: Bedingte Verarbeitung". 2006-12-16. Archiviert von das Original Am 2007-10-22. Abgerufen 2007-09-09.
- ^ "Pythonische Methode zur Implementierung von Switch/Case -Anweisungen". Archiviert von das Original Am 2015-01-20. Abgerufen 2015-01-19.
- ^ Java.sun.com, Java -Sprachspezifikation, 3. Auflage.
- ^ ECMA-international.org Archiviert 2015-04-12 im Wayback -Maschine ECMascript -Sprachspezifikation, 5. Auflage.
- ^ "Muster Matching". Dokumentation für Ruby 3.0.
Externe Links
- Medien im Zusammenhang mit bedingten (Computerprogrammierung) bei Wikimedia Commons
- Wenn nicht (ActionScript 3.0) Video