![]() |
|
|
Das böse SemikolonAn dieser Stelle ist ein Hinweis angebracht. Ein Programmieranfänger schreibt gerne hinter die schließende Klammer der if-Anweisung ein Semikolon. Das führt zu einer ganz anderen Ausführungsfolge. Ein Beispiel: int alter = 29; if ( alter < 0 ) ; System.out.println( "Aha, noch im Mutterleib" ); if ( alter > 150 ) ; System.out.println( "Aha, ein neuer Moses" ); Das Semikolon führt dazu, dass die leere Anweisung in Abhängigkeit von der Bedienung ausgeführt wird und unabhängig vom Inhalt der Variable alter immer die Ausgabe »Aha, noch im Mutterleib« erzeugt. Das ist sicherlich nicht beabsichtigt. Folgen hinter einer if-Anweisung zwei Anweisungen, die nicht durch eine Blockanweisung zusammengefasst sind, dann wird die eine folgende else-Anweisung als Fehler bemängelt, da der zugehörige if-Zweig fehlt. Der Grund ist, dass der if-Zweig nach der ersten Anweisung ohne else zu Ende ist. int alter = 29; if ( alter < 0 ) ; System.out.println( "Aha, noch im Mutterleib" ); else ( alter > 150 ) ; System.out.println( "Aha, ein neuer Moses" ); Das führt zu der Fehlermeldung ’else’ without ’if’. Mehrfachverzweigung beziehungsweise geschachtelte Alternativenif-Anweisungen zur Programmführung kommen sehr häufig in Programmen vor, und noch häufiger ist es, eine Variable auf einen bestimmten Wert zu prüfen. Dazu werden if- und if/else-Anweisung gerne geschachtelt. Wenn eine Variable einem Wert entspricht, dann wird eine Anweisung ausgeführt, sonst wird die Variable mit einem anderen Wert getestet und so weiter. Dieser Ansatz ist sehr umständlich und kostet zudem noch Rechenzeit, da in jedem Fall drei Bedingungen geprüft werden. Wenn also x größer null ist, werden dennoch zwei Vergleiche gemacht. Wir schachteln daher in einer kleinen Programmverbesserung die Alternativen und arbeiten dann mit einer Abfolge von sequenziell abhängigen Alternativen:3 if ( x > 0 ) signum = 1; else if ( x < 0 ) signum = –1; else signum = 0; Jetzt werden nur noch so viele Bedingungen geprüft wie zur Entscheidung notwendig sind. Die eingerückten Verzweigungen nennen sich auch angehäufte if-Anweisungen oder if-Kaskade, da jede else-Anweisung ihrerseits weitere if-Anweisungen enthält, bis alle Abfragen gemacht sind.
2.5.3 Die switch-Anweisung bietet die Alternative
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Hinweis Eine Einschränkung der switch-Anweisung besteht darin, dass die Tests und die Konstanten nur auf den primitiven Datentyp int beschränkt sind. |
Es können also keine größeren Typen wie long oder Fließkommazahlen wie float beziehungsweise double oder gar Objekte benutzt werden. Als Alternative bleiben nur angehäufte if-Anweisungen. Dies ist auch der einzige Weg, um Bereiche abzudecken.
Gibt es keine Übereinstimmung mit einer Konstanten, so lässt sich optional die Sprungmarke default einsetzen:
switch ( ausdruck ) { case Konstante: Anweisungen ... default: }
Ohne Übereinstimmung mit einem konkreten Ziel geht die Abarbeitung des Programmcodes hinter default weiter. default sollte nicht dafür verwendet werden, den letzten gültigen Fall abzudecken. Dazu ist besser ein case gedacht; die Idee von default ist, alles andere abzuhandeln.
Beispiel Ein Taschenrechner mit Alternative
switch ( op ) { case ’+’: // addiere break; case ’-’: // subtrahiere break; case ’*’: // multipliziere break; case ’/’: // dividiere break; default: System.err.println( "Operand nicht definiert!" ); } |
default kann auch zwischen den Konstanten eingesetzt werden, so dass case-Anweisungen vorangehen und nachfolgen. Das ist aber wenig übersichtlich.
Bisher haben wir in die letzte Zeile eine break-Anweisung gesetzt. Ohne ein break würden nach einer Übereinstimmung alle nachfolgenden Anweisungen ausgeführt. Sie laufen somit in einen neuen Abschnitt herein bis ein break oder das Ende von switch erreicht ist. Da dies vergleichbar mit einem Spielzeug ist, bei dem Kugeln von oben nach unten durchfallen, nennt sich dieses auch Fall-Through. Ein häufiger Programmierfehler ist, das break zu vergessen, und daher sollte ein beabsichtigter Fall-Through immer als Kommentar angegeben werden.
Beispiel Über dieses Durchfallen ist es möglich, bei unterschiedlichen Werten immer die gleiche Anweisung ausführen zu lassen:
switch ( buchstabe ) { case ’a’: // Durchfallen case ’e’: case ’i’: case ’o’: case ’u’: vokal = true; break; default: vokal = false; } |
In dem Beispiel bestimmt eine case-Anweisung, ob die Variable buchstabe ein Vokal ist. Fünf case-Anweisungen decken jeweils einen Buchstaben ab. Stimmt die Variable mit einer Konstanten überein, so »fällt« der Interpreter in den Programmcode der Zuweisung. Dieses Durchfallen über die case-Zweige ist praktisch, so wie es unser Programmcode für das Ist-Vokal-Problem zeigt. Der erste case-Zweig setzt die boolesche Variable vokal bei einem Vokal auf wahr. Tritt die Bedingung nicht ein, so weist die Anweisung im default-Teil der Variablen vokal den Wert falsch zu. Es ist übrigens nicht möglich, vor dem nächsten case eine Anweisung wie if zu beginnen, so dass dann der Rumpf von if zu einem der nächsten case-Blöcken gehört.
| Hinweis Obwohl ein fehlendes break zu lästigen Programmierfehlern führt, haben die Java-Entwickler dieses Verhalten vom syntaktischen Vorgänger C übernommen. Eine interessante Lösung wäre gewesen, das Verhalten genau umzudrehen und das Durchfallen explizit einzufordern, zum Beispiel mit einem Schlüsselwort. C# wählt hier auch eine andere Lösung. |

Hier klicken, um das Bild zu Vergrößern

Hier klicken, um das Bild zu Vergrößern
switch und (Strg)+(_____) bietet an, ein Grundgerüst für eine switch Fallunterscheidung anzulegen.
1 Und nicht einfach if (ref) wie in C(++).
2 In der Programmiersprache Python bestimmt die Einrückung die Zugehörigkeit.
3 In der Programmiersprache Euphoria (die Webseite http://www.rapideuphoria.com/ wirbt mit safe und sexy – Huuh) heißt das einfach: return (x > 0) – (x < 0).
| << zurück |
Copyright © Galileo Press GmbH 2004
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.