Bedingt (Computerprogrammierung)

IF-Then-ELSE-Flussdiagramm
Ein verschachteltes "wenn - ELSE" -Flowdiagramm

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 wennEs 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))
  1. True nimmt bis zu zwei Argumente und sobald beide bereitgestellt werden (siehe Currying), es gibt das erste angegebene Argument zurück.
  2. False nimmt bis zu zwei Argumente und sobald beide bereitgestellt werden (siehe Currying), es gibt das zweite angegebene Argument zurück.
  3. 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
  1. ^ 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.
  2. 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.
  3. 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.
  4. 1 2 In Haskell und F#ist ein separates Konstrukt konstanter Auswahl nicht benötigt, da dieselbe Aufgabe mit Musteranpassung erledigt werden kann.
  5. ^ In einem Rubin Fall konstruieren, regulären Ausdruck Die Übereinstimmung gehört zu den verfügbaren bedingten Flusskontrollalternativen. Zum Beispiel siehe Dies Stapelüberlauffrage.
  6. 1 2 SQL hat zwei ähnliche Konstrukte, die beide Rollen erfüllen, beide eingeführt in SQL-92. A "gesucht FALL" Ausdruck CASE WHEN cond1 THEN expr1 WHEN cond2 THEN expr2 [...] ELSE exprDflt END funktioniert wie wenn ... sonst wenn ... sonstwä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).
  7. ^ Arithmetik wenn ist veraltet in Forran 90.
  8. ^ Die Musteranpassung wurde in Ruby 3.0 hinzugefügt.[16] Einige Musteranpassungskonstrukte sind immer noch experimentell.

Siehe auch

Verweise

  1. ^ PHP Elseif Syntax
  2. ^ Visual Basic Elseif Syntax
  3. ^ POSIX -Standard -Shell -Syntax
  4. ^ Haskell 98 Sprache und Bibliotheken: Der überarbeitete Bericht
  5. ^ "If-Then-Else-Vorschlag zu Haskellwiki"
  6. ^ "Effiziente C -Tipps Nr. 6 - Verwenden Sie den ternären Operator nicht" Stack Overflow ".. Embeddedgurus.com. 2009-02-18. Abgerufen 2012-09-07.
  7. ^ "Neue Kontrollstrukturen". Tcler's Wiki. Abgerufen 21. August, 2020.
  8. ^ "Upleevel Manual Page". www.tcl.tk. Abgerufen 21. August, 2020.
  9. ^ "Wenn manuelle Seite". www.tcl.tk. Abgerufen 21. August, 2020.
  10. ^ "Wenn und wenn Sie Ausdrücke lassen". Abgerufen 1. November, 2020.
  11. ^ "American National Standard Programmiersprache Forran". 1978-04-03. Archiviert von das Original Am 2007-10-11. Abgerufen 2007-09-09.
  12. ^ "Visualworks: Bedingte Verarbeitung". 2006-12-16. Archiviert von das Original Am 2007-10-22. Abgerufen 2007-09-09.
  13. ^ "Pythonische Methode zur Implementierung von Switch/Case -Anweisungen". Archiviert von das Original Am 2015-01-20. Abgerufen 2015-01-19.
  14. ^ Java.sun.com, Java -Sprachspezifikation, 3. Auflage.
  15. ^ ECMA-international.org Archiviert 2015-04-12 im Wayback -Maschine ECMascript -Sprachspezifikation, 5. Auflage.
  16. ^ "Muster Matching". Dokumentation für Ruby 3.0.

Externe Links