Java: Syntax-Grundlagen III Verzweigungen, bedingte Anweisungen Eines der wesentlichen Merkmale einer Programmiersprache ist ihre Fähigkeit, Operationen situationsbedingt ausführen zu können, d.h. eine Anweisungsfolge nur dann zu durchlaufen, wenn vorgegebene Bedingungen erfüllt sind, und anderfalls entweder gar nichts zu tun oder aber andere Anweisungen auszuführen. Zum Beispiel sollte die Berechnung der Quadratwurzel einer Variablen nur dann ausgeführt werden, wenn der aktuelle Wert der Variablen größer oder gleich Null ist, anderfalls könnte eine entsprechende Meldung an den Anwender des Programms auf den Bildschirm gegeben werden. Java bietet für diese Zwecke die if-anweisung als sog. Einwegverzweigung und die switch-anweisung als Mehrwegverzweigung an. if- und if--anweisungen Die Einwegverzweigungen "if" und "if-" prüfen, ob eine Bedingung wahr oder falsch ist und führen in Abhängigkeit davon entweder den sog. "then-zweig" oder den "-Zweig" aus. Die Syntax der einfachen if-anweisung ohne den -Zweig lautet wenn nur eine Anweisung auszuführen ist: if (Bedingung) Anweisung; wenn ein Anweisungsblock auszuführen ist: if (Bedingung) { Anweisung1; Anweisung2; Anweisung3; Die Verzweigung beginnt mit dem Schlüsselwort "if" gefolgt von einem in runde Klammern gesetzten Ausdruck des Typs boolean, dahinter folgt der then-zweig als einmalige Anweisung oder als Anweisungsfolge innerhalb geschweifter Klammern. Einen -Zweig gibt es hier nicht, d.h. wenn der Ausdruck "Bedingung" den Wert false aufweist, wird der then-zweig lediglich übersprungen. Beispiel: double x; if (x >= 0.0) { x = Math.sqrt(x); System.out.println("Quadratwurzel von x = "+x); Prof. Dr.-Ing. Gudrun Breitzke Grundlagen Java-Syntax III - 1
Die Syntax der if--anweisung lautet if (Bedingung) AnweisungA; AnweisungB; Hier gibt es zusätzlich den -Zweig mit Anweisungen, die nur dann ausgeführt werden, wenn der Ausdruck "Bedingung" den Wert false aufweist. Auch hier kann eine einzelne Anweisung des then-zweigs oder des -Zweigs alleine hinter die Bedingung bzw. das Schlüsselwort "" geschrieben werden, sollen jedoch jeweils mehrere Anweisungen durchlaufen werden, ist der jeweilige Anweisungsblock in geschweifte Klammern zu setzen: if (Bedingung){ AnweisungA1; AnweisungA2; AnweisungA3; { AnweisungB1; AnweisungB2; AnweisungB3; Beispiel: double x; if (x >= 0.0) { x = Math.sqrt(x); System.out.println("Quadratwurzel von x ="+x); System.out.println("x < 0, Quadratwurzel nicht moeglich"); In der o.a. Syntax und den Beispielen werden die Anweisungen nach rechts eingerückt, damit im Quelltext auf den ersten Blick sichtbar wird, welche Anweisungen zum then- und welche zum -Zweig gehören. Prof. Dr.-Ing. Gudrun Breitzke Grundlagen Java-Syntax III - 2
Dangling if- und if--anweisungen können geschachtelt werden, d.h. in den Anweisungsblöcken des then- oder des -Zweigs können wiederum if- bzw. if-- Anweisungen enthalten sein. Hier ist es sehr wichtig, auch einzelne Anweisungen durch geschweifte Klammern eindeutig der gewünschten if-anweisung zuzuordnen, da sich ansonsten das sog. "dangling--problem" ergeben kann. Die Übersetzung lautet in etwa "das in der Luft hängende ". Die Problematik soll an folgendem Beispiel erläutert werden: if (a >= b) max = b; Durch die Einrückung im o.a. Beispiel wird der Eindruck erweckt, dass die Anweisung "max=b;" im -Zweig der ersten Bedingung und somit nur dann ausgeführt wird, wenn "a < b" das ist jedoch nicht der Fall! In Java gilt die Regel, dass ein -Zweig immer der nächstgelegenen inneren if-anweisung zugeordnet wird. Im o.a. Beispiel würde daher "max=b;" im then-zweig der zweiten Bedingung ausgeführt, und daher nur, wenn "a 0". Folgende Schreibweise betont den wirklichen Zusammenhang: if (a >= b) max = b; Wenn die die Anweisung "max=b;" zur äußeren if-anweisung gehören soll, muss daher an dieser Stelle Eindeutigkeit durch die Verwendung von Klammern hergestellt werden: if (a >= b) { max = b; Prof. Dr.-Ing. Gudrun Breitzke Grundlagen Java-Syntax III - 3
switch-anweisung Die switch-anweisung ist eine Mehrwegverzweigung, durch die eine Sequenz von if--anweisungen ersetzt werden kann. Sie prüft den Wert eines Ausdrucks vom Datentyp int, short, byte oder char und reagiert in Abhängigkeit vom aktuellen Wert des Ausdrucks. Ihre Syntax lautet wie folgt: switch (Ausdruck) { case konst1: Anweisung11; Anweisung12; ; case konst2: Anweisung21; Anweisung22; ; default: Anweisung; Das Schlüsselwort "case" ist ein sog. Einsprungziel, d.h. es werden alle Anweisungen hinter demjenigen case ausgeführt, dessen Wert "konst" mit dem Wert des Ausdrucks übereinstimmt. Falls der Ausdruck mit keiner der Konstanten der case-ziele übereinstimmt, wird optional die hinter "default:" stehende Anweisung ausgeführt. Durch die break-anweisung am Ende einer Anweisungsfolge wird erreicht, dass die nachfolgenden case-anweisungen übersprungen werden. Folgendes beispielhafte Programmstück wertet eine Monatszahl zwischen 1 und 12 aus und gibt die zugehörige Zahl der Monatstage aus: int monat, tag=0; switch (monat){ case 1: case 3: case 5: case 7: case 8: case 10: case 12: tag = 31; case 2: tag = 28; case 4: case 6: case 9: case 11: tag = 30; default: System.out.println("Fehler: Keine Zahl zwischen 1 und 12"); System.out.println("Der "+monat+". Monat hat "+tag+" Tage!"); Prof. Dr.-Ing. Gudrun Breitzke Grundlagen Java-Syntax III - 4
Die Switch-Anweisung des o.a. Beispiels könnte natürlich auch über eine if- Anweisung codiert werden, z.b. wie folgt: int monat, tag=0; if (monat==1 monat==3 monat ==5 monat==7 monat==8 monat ==10 monat == 12) tag = 31; if (monat==2) tag = 28; if (monat==4 monat==6 monat ==9 monat==11) tag = 30; System.out.println("Fehler: Keine Zahl zwischen 1 und 12"); System.out.println("Der "+monat+". Monat hat "+tag+" Tage!"); Welche Anweisungsform gewählt wird, ist letztendlich vom "Geschmack" des Programmierers abhängig, jedoch ist die switch-anweisung i.d.r. schneller, benötigt aber mehr Speicherplatz als die if-anweisung! Prof. Dr.-Ing. Gudrun Breitzke Grundlagen Java-Syntax III - 5