Mit dem bisherigen Wissen können Sie die Programme immer nur sequenziell ablaufen lassen. Sie laufen also immer Zeile für Zeile ab. In diesem Kapitel wird nun der sequenzielle Programmfluss gebrochen.
8 Kontrollstrukturen
Sie haben folgende drei Möglichkeiten, um den sequenziellen Programmfluss zu ändern:
- Verzweigungen: Im Programm wird eine Bedingung definiert, die entscheidet, an welcher Stelle das Programm fortgesetzt werden soll.
- Schleifen (Iteration): Ein Anweisungsblock wird so oft wiederholt, bis eine bestimmte Abbruchbedingung erfüllt wird.
- Sprünge: Die Programmausführung wird mithilfe von Sprungmarken an einer anderen Position fortgesetzt. Obwohl sie nach wie vor möglich sind, werden Sprünge in einem Programm mittlerweile als schlechter Stil angesehen. Sie sind auch nicht notwendig. Mit dem bisher Gesagten meine ich direkte Sprünge. Mit Schlüsselwörtern wie return, break, continue, exit und der Funktion abort() können jedoch kontrollierte Sprünge ausgeführt werden.
8.1 Verzweigungen mit der »if«-Bedingung 

Die if-Bedingung hat folgende Syntax:
if(BEDINGUNG == wahr) { Anweisung1; } Anweisung2;
Wenn die Bedingung zwischen den Klammern des if-Schlüsselwortes wahr (true) ist, wird Anweisung1 im Anweisungsblock ausgeführt. Anschließend wird das Programm bei Anweisung2, also nach dem Anweisungsblock, fortgesetzt. Ist die Bedingung unwahr (false), wird Anweisung1 nicht ausgeführt, und das Programm fährt sofort mit Anweisung2 fort.
8.1.1 Anweisungsblock 

In einem Anweisungsblock werden Anweisungen (mindestens eine) zusammengefasst. Als Anweisungsblock gelten alle Anweisungen, die zwischen geschweiften Klammern ({}) stehen. Anweisungsblöcke lassen sich auch ineinander verschachteln. Es empfiehlt sich daher, beim Erstellen eines Programms auf eine saubere Strukturierung (d. h. entsprechendes Einrücken bei den Anweisungen eines Blocks) zu achten, um den Überblick zu wahren.
Den Programmablauf der if-Bedingung können Sie sich schematisch so vorstellen wie in Abbildung 8.1 (die Darstellung wird auch als Programmablaufplan bezeichnet):
Abbildung 8.1 Programmablaufplan zur »if«-Anweisung
Sehen Sie sich dazu das folgende Programmbeispiel an:
/* if1.c */ #include <stdio.h> int main(void) { unsigned int alter; printf("Wie alt sind Sie: "); scanf("%u", &alter); /* ... noch jünger als 18? */ if(alter < 18) { printf("Sie sind noch nicht volljährig\n"); } printf("Bye\n"); return 0; }
Das Programm fordert Sie auf, Ihr Alter einzugeben. In der Bedingung if(zahl < 18) wird überprüft, ob Sie jünger als 18 Jahre sind. Sind Sie jünger, wird die printf()-Anweisung im Anweisungsblock mit entsprechender Ausgabe bearbeitet. Wurde aber ein Wert eingegeben, der größer oder gleich 18 ist, wird nur die printf()-Anweisung hinter dem Anweisungsblock ausgeführt, die »Bye« ausgibt. Abbildung 8.2 zeigt den Programmablaufplan zu diesem Beispiel:
Abbildung 8.2 Programmablaufplan zum Listing
Jetzt soll das Programm um einige if-Bedingungen erweitert werden:
/* if2.c */ #include <stdio.h> int main(void) { unsigned int alter; printf("Wie alt sind Sie: "); scanf("%u", &alter); if(alter < 18) { printf("Sie sind noch nicht volljährig\n"); } if(alter > 18) { printf("Sie sind volljährig\n"); } if(alter == 18) { printf("Den Führerschein schon bestanden?\n"); } printf("Bye\n"); return 0; }
Es ist offensichtlich, wie das Programm vorgeht: Sie geben das Alter ein, und mithilfe der einzelnen if-Bedingungen testet es, ob die eingegebene Zahl größer, kleiner oder gleich 18 ist. Bevor das Programm etwas genauer analysiert wird, sollten Sie sich eine Tabelle mit den bisher verwendeten Vergleichsoperatoren und ihrer jeweiligen Bedeutung ansehen.
Vergleichsoperator | Bedeutung |
a < b |
wahr, wenn a kleiner als b |
a <= b |
wahr, wenn a kleiner oder gleich b |
a > b |
wahr, wenn a größer als b |
a >= b |
wahr, wenn a größer oder gleich b |
a == b |
wahr, wenn a gleich b |
a != b |
wahr, wenn a ungleich b |
Zurück zum Programm. Die erste Anweisung
if(alter < 18)
testet, ob die Zahl, die Sie eingegeben haben, kleiner als 18 ist. Ist die Bedingung wahr, springt das Programm unmittelbar in den für diese Bedingung geschriebenen Anweisungsblock, der in den geschweiften Klammern steht. Falls also die eingegebene Zahl kleiner als 18 ist, wird der Anweisungsblock
{ printf("Sie sind noch nicht volljährig\n"); }
ausgeführt. Besteht der Anweisungsblock hinter der Kontrollstruktur lediglich aus einer einzigen Anweisung, so können die geschweiften Klammern auch weggelassen werden:
if(alter < 18) printf("Sie sind noch nicht volljährig\n");
Diese Schreibweise ist korrekt und wird auch häufig verwendet. Sie sollten sich jedoch klarmachen, dass sie sehr leicht zur Fehlerquelle werden kann – nämlich dann, wenn Sie eine weitere Anweisung hinzufügen wollen, die auch nur in dem Fall ausgeführt werden soll, wenn die if-Bedingung wahr ist, wie etwa im folgenden Beispiel:
if(alter < 18) printf("Sie sind noch nicht volljährig\n"); printf("Sollte nur erscheinen, wenn (alter < 18)!\n");
Wenn – wie hier – dann die geschweiften Klammern vergessen werden, wird die zweite printf()-Anweisung immer ausgeführt, da die if-Bedingung im Wahr-Fall wirklich nur eine weitere Anweisung ausführt.
Korrekt müsste es folgendermaßen aussehen:
if(alter < 18) { printf("Sie sind noch nicht volljährig\n"); printf("Sollte nur erscheinen, wenn (alter < 18)!\n"); }
Jetzt wird auch die zweite Anweisung nur ausgeführt, wenn die if-Bedingung wahr ist.
Die nächsten beiden if-Bedingungen verhalten sich analog. Hiermit wird getestet, ob die eingegebene Zahl für das Alter kleiner bzw. gleich 18 ist. Sollte sich einer dieser Fälle als wahr herausstellen, so wird ebenfalls der jeweils zugehörige Anweisungsblock ausgeführt.
Achtung |
Ein häufig gemachter Fehler ist if(alter=18). Hier wurde der Variablen alter der Wert 18 zugewiesen, und der Anweisungsblock wird ausgeführt. Dabei ist es jedoch egal, ob der Wert gleich 18 ist, denn alter wird jetzt der Wert 18 zugewiesen. Diese if-Abfrage ist also immer wahr. Der Fehler ist zudem schwer auffindbar, da die Syntax absolut korrekt ist, der Compiler also keine Fehlermeldung anzeigt. Eine oft verwendete und empfohlene Maßnahme ist es, die Überprüfung umzustellen: if (18 == alter) ist syntaktisch korrekt und bewirkt das Gleiche. Hiermit würde der Compiler sofort eine Fehlermeldung anzeigen, falls Sie versehentlich if (18 = alter) schreiben, da sich einer Zahl keine Variable zuordnen lässt. Diese Umstellungsmethode funktioniert nur bei ==–Vergleichen, nicht bei den anderen Operatoren. |
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.