Anfang   zurück   weiter

5. Kontrollstrukturen

Kontrollstrukturen definieren die Reihenfolge, in der Berechnungen durchgeführt werden. Einerseits sind dies Konstrukte mit denen Entscheidungen getroffen werden, anderseits solche mit denen Programmschleifen aufgebaut werden.

if-else & else if
Mit der if-else Anweisung werden Entscheidungen formuliert, wobei der else-Teil optional ist. Die entsprechende Syntax ist:

if (ausdruck)
    anweisung
else
    anweisung
if Anweisungen können ineinander verschachtelt werden, man muß jedoch beachten, daß ein else Teil mit dem letzten else-losen if verbunden wird. Im folgenden Programmteil
if (bedingung1)
   if (bedingung2)
      anweisung;
   else
      anweisung;
gehört der else-Teil zum zweiten if und nicht zum ersten. Um Irrtümer zu vermeiden empfiehlt es sich bei verschachtelten if-Anweisungen diese als Block zu klammern.
if (bedingung1)
   {
   if (bedingung2)
      anweisung;
   }
else
   anweisung;

Immer wenn eine if-Anweisung in ihrem else-Zweig eine weitere if-Anweisung enthält, kann man die Lesbarkeit des Programmes dadurch verbessern, daß die beiden Worte else und if als else if-Anweisung gemeinsam auf die Höhe des ersten ifs eingerückt werden.

if (wahl==1)
   anweisung1;
else if (wahl==2)
      anweisung2;
   else if (wahl==3)
         anweisung3;
      else
         falsch_anweisung;

switch
Um aus mehreren Möglichkeiten eine Auswahl zu treffen, gibt es in C eine weitere Kontrollstruktur, die aber auf Situationen, in denen ein ganzzahliger Ausdruck mit bestimmten alternativen Werten auf Gleichheit verglichen wird, beschränkt ist. Diese Struktur wird aus dem Schlüsselwort switch, einem geklammerten Integerausdruck und einem Block gebildet. Zwischen die Anweisungen des Blocks sind case-Marken gestreut. Falls der Ausdruck hinter dem Wort switch den Wert einer sochen Marke hat, wird das Programm bei der Marke fortgesetzt. Am Ende jedes Zweiges muß eine break-Anweisung stehen, damit das Programm hinter dem switch-Block fortgesetzt wird. Optional kann eine default-Marke angeführt werden, wo, falls keine der case-Konstanten paßt, das Programm fortgesetzt wird. Ist keine default-Marke vorhanden und paßt keine der Konstanten, so findet im switch-Teil keine Aktion statt. case und default können in beliebiger Reihenfolge aufscheinen, der default-Zweig wird aber üblicherweise an die letzte Stelle einer switch-Anweisung plaziert.

switch (ausdruck)
{
case konstante1:
     anweisung;
...
     anweisung;
     break;
case konstante2:
     anweisung;
...
     anweisung;
     break;
default:
     anweisung;
...
     anweisung;
     break;
}
for
In der for-Schleife werden eine oder mehrere Anweisungen eine bestimmte Zahl mal hintereinander ausgeführt. Sie hat die folgende Struktur
for(Initialisierung;Bedingung;Reinitialisierung)
   Anweisung;
Fehlen Initialisierung oder Reinitialisierung wird die Schleife nicht initialisiert bzw. reinitialisiert.
Als Beispiel folgt eine Schleife in der von 10 auf Null heruntergezählt wird:
for(i=10, printf("Countdown\n\n"); i>=0; printf("n = %i\n", i),i--) ;
Man beachte hier den Einsatz des Komma Operators, und der leeren Anweisung (nur ;). Falls die Bedingung fehlt, wird die Schleife "ewig" ausgeführt. Damit stellt die Anweisung
for(;;) ;
eine Endlosschleife dar, da sie keine Abbruchbedingung enthält und daher auch kein Ende findet.

while
In der while-Schleife wird zunächst eine Bedingung bewertet und danach die abhängige Anweisung ausgeführt:

while (bedingung)
       anweisung;
Abhängig von der Bedingung kann es sein, daß die while-Schleife gar nicht zur Ausführung gelangt.

do while
Im Gegensatz zur while-Schleife wird die Bedingung bei do-while erst am Ende der Schleife nach jedem Durchgang geprüft. Das heißt do-while wird auf jeden Fall einmal ausgeführt.

do
       anweisung;
while (bedingung);
Solange also die Bedingung als wahr bewertet wird, kommt die Schleife zur Ausführung. Achten Sie auf die Notwendigkeit des Vorhandenseins des Strichpunktes nach dem Ende der Bedingung. Die Erfahrung zeigt, daß do-while wesentlich seltener benutzt wird, als while oder for.

break & continue
Es ist gelegentlich vorteilhaft, wenn man Schleifen anders als nur durch Abbruchkriterien am Anfang oder Ende verlassen kann. Mit der break-Anweisung kann man, genau wie in einer switch-Anweisung, for-, while- und do-Schleifen vorzeitig verlassen. break sorgt dafür, daß die innerste umgebende Schleife sofort verlassen wird.
Die continue-Anweisung gleicht break, kommt aber weniger oft zum Einsatz. Sie sorgt dafür, daß die nächste Wiederholung der umgebenden Schleife unmittelbar begonnen wird.

Sprungbefehle
Wenn sie auch verpönt sind, so hat C doch auch Sprungbefehle. break und continue sind ja eigentlich schon Sprungbefehle, wenn diese auch nicht direkt als solche erkenntlich sind. Auch in der switch Anweisung kommen Sprünge vor, und dort kam die C-Form der Sprungmarken auch schon zur Anwendung. Beim goto Befehl wird hinter dem goto ein sogenanntes Label (Sprungmarke) angegeben, das irgendwo im Programm dann in einer Zeile aufscheint. Dabei darf der Sprung nicht aus einer Funktion herausführen und das Label darf auch nur einmal in der Funktion vorkommen.
if (bedingung) goto ZIEL;
...
ZIEL:
anweisung;
...
anweisung;
...
oder
...
ZIEL:
anweisung;
...
anweisung;
if (bedingung) goto ZIEL;
...

Felder und Zeichenketten