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:
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);
}