5 Kontrollstrukturen (Verbundanweisungen)

5.1 Vorbemerkungen
 
 

C enthält ein Blockkonzept. Das heißt, das überall dort, wo in der Syntaxbeschreibung der Begriff Anweisung auftaucht, kann auch ein ganzer Block stehen, der in die Klammern { und } eingeschlossen Variablenvereinbarungen und mehrere Anweisungen enthält.

In C gibt es keinen Datentyp für logische Ausdrücke. Die Anweisung variable = 5; besitzt den arithmetischen Wert 5 und gleichzeitig den logischen Wert wahr, den alle Ausdrücke ungleich 0 besitzen. Alle Ausdrücke mit dem Wert gleich 0 haben den logischen Wert falsch.

In den folgenden Syntaxbeschreibungen steht deshalb immer der Begriff Ausdruck, wo in anderen Programmiersprachen der Begriff Bedingung steht.
 
 

5.2 Auswahlanweisungen (Selektionen)
 
 

Bedingte Anweisung mit Alternative (if ... else ...)
 
 

Syntax:
 
 
 
 

if (Ausdruck) Anweisung1 | Block1 [ else Anweisung2 | Block2 ]
 
 
 
 
 
 
 
 
 

Beispiel: if (i > 3) x= 5;

else x= 0;

x= x + 2;
 

Mehrfachauswahl (switch)
 
 
 
 
 

Syntax: switch (Ausdruck)

{

case konstante_1 : Anweisung 1

[break;]

[ case konstante_2 : Anweisung 2 ]

[break;]

...

[ case konstante_n: Anweisung n ]

[break;]

[ default: Anweisung m ]

}
 
 
 
 

Bei der switch-Anweisung verzweigt das Programm in Abhängigkeit des Wertes von Ausdruck. Die Konstante, die bei jedem case zum Vergleich herangezogen wird, muss eine ganze Zahl sein. Da in C auch Zeichen als ganze Zahlen behandelt werden, können sie auch verwendet werden. Die Konstanten dürfen nicht mehrmals vorhanden sein. Kann unter den angegebenen Konstanten keine gefunden werden, die gleich Ausdruck ist, wird die Anweisung ausgeführt, die nach dem Schlüsselwort default gefunden wird.

Mit der switch-Anweisung kann eine große Zahl von if-Anweisungen ersetzt werden. Bei der switch-Anweisung muss in jedem case-Block ein break an letzter Stelle stehen; dadurch ist es nicht nötig, case-Blöcke mit geschweiften Klammern zu kennzeichnen. Fehlen die break-Anweisungen, so werden alle folgenden case-Anweisungen, unabhängig von der Bedingung, ausgeführt. Es handelt sich bei den case-Anweisungen um Einsprungstellen.
 
 

Beispiel:
 
 

switch (x)
{
case 0 : y= 5 * z; break;
case 1 : y= 2 / z; break;
case 2 :
case 3 :
case 4 :
case 5 : y++;
z= 3 * y; break;
default: y= x;
}
 
 
 
 
 
 

5.3 Wiederholungsanweisungen (Iterationen)
 
 

Die while-Anweisung
 
 

Syntax:
 
 
 
 

while (Ausdruck) Anweisung | Block
 
 
 
 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Da hier vor jedem Schleifendurchgang die Bedingung überprüft wird, heißt die while-Schleife kopfgesteuerte Schleife.
 
 

Beispiel:
 
 
 
 

while (i <= 10)

{

printf(" i= %d\n", i++);

i++;

}
 
 
 
 
 
 
 
 

Die for-Anweisung
 
 

Syntax:
 
 
 
 
 
 

for ( [ i_Ausdruck ]; [ b_Ausdruck ]; [ r_Ausdruck ])

Anweisung | Block
 
 
 
 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Beispiel 1:
 
 
 
 

int i;

for (i= 0; i <= 10; i++) printf("i= %d\n", i);
 
 
 
 

Beispiel 2:
 
 
 
 

for (;;) printf("Das ist eine Endlosschleife.\n");
 
 
 
 

Beispiel 2 zeigt, dass auch alle Ausdrücke fehlen können. In diesem Fall ist die getestete Bedingung stets wahr, so dass diese Schleife endlos läuft.
 
 

Die do-while-Anweisung
 
 

Syntax:
 
 
 
 

do

Anweisung | Block

while (Ausdruck)
 
 
 
 
 
 

Solche Schleifen werden auch als fußgesteuerte Schleifen bezeichnet.
 
 

Beispiel:
 
 
 
 

i= 1;

do

{

printf("i= %d\n", i);

i++;

}

while (i <= 10);
 
 

5.4 Kontrolltransfer-Anweisungen
 
 

Kontrolltransfer-Anweisungen dienen dazu, die Programmkontrolle von einer Anweisung an eine andere zu übertragen. In C stehen folgende Anweisungen dieser Art zur Verfügung:

  1. break
  1. continue
  1. goto und
  1. return.

 
 

Die break-Anweisung
 
 

Syntax: break;
 
 

Die break-Anweisung ermöglicht es, die innere Schleife einer for-, while- ,do-while- oder einer switch-Anweisung vorzeitig zu verlassen.

Beispiel:
 
 
 
 

do

{

if (i < 0) break;

printf("i= %d\n", i);

i++;

}

while (i <= 10);
 
 

Die continue-Anweisung
 
 

Syntax: continue;

Mit Hilfe der continue-Anweisung kann der aktuelle Schleifendurchlauf bei while-, do- oder for-Anweisungen abgebrochen werden.
 
 

Beispiel:
 
 
 
 

for (i= 0; i <= 30; i++)

{

if ((x= i % 3) == 0) continue;

printf ("i= %d\n", i);

}
 
 
 
 
 
 

Die goto-Anweisung
 
 

Syntax: goto marke;

...

marke: anweisung;
 
 

Die goto-Anweisung bewirkt einen Sprung an einen durch marke gekennzeichneten Punkt im Programm. Das Programm wird dann mit der Anweisung fortgesetzt, die hinter marke aufgeführt ist. Der Sprungbefehl goto und die dazugehörige Sprungmarke müssen sich innerhalb derselben Funktion befinden. Ein Sprung über Funktionsgrenzen hinweg ist nicht erlaubt.

Der Name der Sprungmarke kann vom Programmierer frei gewählt werden. Es gelten die gleichen Regeln, wie für die Wahl von Konstanten- und Variablennamen.
 
 

Beispiel:
 
 
 
 

{

for (x= 0; x < 100 ; x++)

{

for (y= 0; y < 100 ; y++) {

for (z= 0; z < 100 ; z++)

{

if (fehler == 1 ) goto ende;

printf("Kein Fehler!\n");

}

}

} }

ende :

printf("Es ist ein Fehler aufgetreten!\n");
 
 
 
 
 
 

Die return-Anweisung
 
 

Syntax: return ([wert]);
 
 

Die return-Anweisung verursacht den Abbruch eines Funktionsaufrufes und die Rückkehr in das aufrufende Programm. Dabei kann ein definierter Wert zurückgegeben werden. Der Typ des Rückgabewertes ist von der Funktionsdeklaration abhängig.
 
 

Beispiel:
 
 
 
 

funktion1(...)

{

...

return (x);

}
 
 

double funktion2(...)

{

...

return (y);

}