Einebedingte Anweisung ist eineKontrollstruktur in derProgrammierung. Ein Programmabschnitt wird dabei nur unter einer bestimmten Bedingung ausgeführt.
EineVerzweigung legt fest, welcher von zwei oder mehreren Programmabschnitten, abhängig von einer oder mehreren Bedingungen, ausgeführt wird.
Eine bedingte Anweisung besteht aus einerBedingung und einemCodeabschnitt, der wiederum aus einer oder mehrerenAnweisungen besteht. Wird beimProgrammablauf die bedingte Anweisung erreicht, dann wird erst die Bedingung ausgewertet, und falls diese zutrifft (und nur dann), wird anschließend der Codeabschnitt ausgeführt. Danach wird die Programmausführung mit den auf die bedingte Anweisung folgenden Anweisungen fortgesetzt.
InPseudocode formuliert hat eine bedingte Anweisung folgende Form:
fallsBedingung dannAnweisung(en)ende
Die Bedingung ist einAusdruck, der nach den dafür geltenden Regeln derProgrammiersprache (Semantik undVorrangfolge derOperatoren) ausgewertet wird. Er muss als Resultat einenWahrheitswert (wahr: Bedingung trifft zu, oderfalsch: Bedingung trifft nicht zu) liefern, oder sein Resultat muss nach denUmwandlungsregeln der Sprache implizit in einen Wahrheitswert umwandelbar sein.
Die Bedingung ist nicht generell gültig, sondern zeitabhängig. Sie wird jedes Mal ausgewertet, wenn die bedingte Anweisung beim Programmablauf erreicht wird, und es kommt darauf an, ob sie zu dem jeweiligen Zeitpunkt zutrifft oder nicht. Das kann sich von mal zu mal ändern, wenn die bedingte Anweisung mehrmals erreicht wird.
Beispiele: In vielen Programmiersprachen mitC-ähnlicher Syntax, z. B.C++,C# undJava, werden bedingte Anweisungen folgendermaßen formuliert:
if(Temperatur<20)Heizung_Einschalten();
Ist der hier abgefragte WertTemperatur
kleiner als 20, wird dieFunktionHeizung_Einschalten()
ausgeführt. Ist die Bedingung nicht erfüllt, alsoTemperatur
nicht kleiner als 20, wird die Anweisung übersprungen.
In derDatenbankspracheSQL gibt es etwa folgendes Konstrukt:
DELETEFROMtabelleWHEREtabelle.id=42;
Dies entspricht einerSchleife, die über die Einträge in einer Tabelle geht und in der für jeden Tabelleneintrag eine bedingte Anweisung ausgeführt wird: Alle Einträge, für die die Bedingung „id = 42“ zutrifft, werden gelöscht; alle übrigen Einträge bleiben dabei unberührt.
Eine Verzweigung, auchAuswahl oderSelektion genannt, besteht aus einer Bedingung und zwei Codeabschnitten. Wieder wird erst die Bedingung ausgewertet, und falls sie zutrifft, wird anschließend der erste Codeabschnitt ausgeführt, anderenfalls wird der zweite Codeabschnitt ausgeführt:
fallsBedingung dannAnweisung(en)sonstAnweisung(en)ende
Beispiel in der ProgrammierspracheC:
if(Temperatur<20)Heizung_Einschalten();elseHeizung_Ausschalten();
In manchen Programmiersprachen gibt es den ternären Auswahloperator, der auchbedingter Ausdruck genannt wird. DieserOperator kann zum Beispiel für Wertzuweisungen anVariablen verwendet werden, aber auch Bestandteil von komplexeren Ausdrücken sein. Er verarbeitet dreiParameter in der FormwennBedingung dannAusdruck1 sonstAusdruck2
. Zuerst wirdBedingung
ausgewertet. Ist das Ergebniswahr, wirdAusdruck1
ausgewertet, anderenfallsAusdruck2
. Das dabei entstehende Ergebnis ist auch das Ergebnis des Auswahloperators. FolgenderCode in der ProgrammierspracheC zeigt zweimal die gleiche Aktion – einmal als if-else-Konstrukt und einmal mit dem Auswahloperator:
// Variante mit if-else-Anweisungconstchar*str1;if(zahl==5)str1="Zahl gleich 5";elsestr1="Zahl ungleich 5";// Variante mit Auswahloperatorconstchar*str2=zahl==5?"Zahl gleich 5":"Zahl ungleich 5";// Initialisierung einer immutablen Variable mit Auswahloperator (mit if-else nicht möglich)constchar*conststr3=zahl==5?"Zahl gleich 5":"Zahl ungleich 5";
In vielen Sprachen wird der Operator mit den Wortenif
-then
-else
formuliert, z. B. inF#:
letx=ifzahl<5then0else1
In vielen Programmiersprachen gibt es auch mehrfache Verzweigungen, auchFallunterscheidungen genannt. Dabei sind zwei Formen zu unterscheiden: Entweder bestimmt das Ergebnis einesAusdrucks, welcher von mehreren Codeabschnitten ausgeführt wird und ob überhaupt einer davon ausgeführt wird, oder es gibt mehrere Bedingungen, denen jeweils ein Codeabschnitt zugeordnet ist. In beiden Formen kann einelse-Teil vorhanden sein.
Der Ausdruck wird ausgewertet und mit den Wertangaben (hierWert1
bisWert3
) verglichen. Bei Übereinstimmung werden dieAnweisungen nach der Wertangabe ausgeführt. Wenn kein Wert übereinstimmt, werden die Anweisungen nachsonst
ausgeführt, falls derelse-Teil vorhanden ist:
fallsAusdruck gleich Wert1:Anweisung(en) Wert2:Anweisung(en) Wert3:Anweisung(en) sonst:Anweisung(en)ende
Beispiel in der ProgrammierspracheC:
switch(zahl){case0:v=1;break;// 'break' ist hier nötig, damit nicht auch die ...case1:v=2;break;// ... folgenden Anweisungen ausgeführt werden (Besonderheit in C)case2:v=5;break;default:v=10;// der sonst-Teil}
Das folgende Beispiel in der ProgrammierspracheC# prüft, in welcher (meteorologischen) Jahreszeit ein Datum liegt, und gibt eine Textzeile aus:
intmonth=date.Month;stringseason;switch(month){case3:case4:case5:season="spring";break;case6:case7:case8:season="summer";break;case9:case10:case11:season="autumn";break;case12:case1:case2:season="winter";break;default:season="invalid date";break;}Console.WriteLine("The date is in "+season+".");
Die genaueSemantik eines solchen Konstrukts hängt stark von der jeweiligen Programmiersprache ab. So ist z. B. derelse-Teil nicht immer erlaubt, manchmal muss er aber vorhanden sein. Manchmal schreibt die Sprachdefinition auch vor, dass es zu einemLaufzeitfehler kommt, falls derelse-Teil fehlt und der Ausdruck keinen der angegebenen Werte annimmt.
Die Bedingungen werden der Reihe nach ausgewertet, solange, bis eine davon zutrifft. Dann wird der zu dieser Bedingung gehörende Codeabschnitt ausgeführt, und die Behandlung der mehrfachen Verzweigung ist damit beendet. Wenn keine der Bedingungen zutrifft, wird derelse-Teil ausgeführt, falls er vorhanden ist:
fallsBedingung dannAnweisung(en)sonst fallsBedingung2 dannAnweisung(en)sonstAnweisung(en)ende
In technischer Hinsicht ist das in den meisten Sprachen kein eigenständiges Konstrukt, sondern wird als Verkettung von Verzweigungen realisiert, indem jede Verzweigung, außer der ersten, den Else-Teil der vorhergehenden Verzweigung darstellt.
Die folgendeMethode in der ProgrammierspracheC# prüft, ob ein Zeitpunkt vor, nach oder in einem gegebenen Zeitraum liegt und gibt eine Textzeile aus:
voidCompare(DateTimetime,DateTimestartTime,DateTimeendTime){if(time<startTime)Console.WriteLine("The point in time is before the period.");else// time >= startTime{if(time>endTime)Console.WriteLine("The point in time is after the period.");else// time >= startTime && time <= endTimeConsole.WriteLine("The point in time is in the period.");}}