6.3. Verschachtelte if-Anweisungen

Anweisungen innerhalb eines if- oder else-Zweigs — also jenen Anweisungen, die nur unter bestimmten Bedingungen ausgeführt werden — können ihrerseits if-Anweisungen sein. Ein untergeordnetes if ist mithin abhängig von der Auswertung eines übergeordneten if und wird nur dann abgearbeitet, wenn der übergeordnete if- bzw. else-Zweig zur Ausführung kommt.

Um in unserem Beispielprogramm festzustellen, ob die gedrückte Sondertaste eine der Funktiontasten zwischen (F1) und (F10) war, müssen wir zusätzliche Bedingungen formulieren:


.
.
/* umständliches Verfahren (ohne logische Operatoren),
 * um festzustellen, ob der Scancode der gedrückten
 * Taste größer gleich 59 und kleiner gleich 68 ist
 */
if( cChar == 0 ){
	iExtended = getch();

if( iExtended >= 59 )
	{
	/* 59 ist der Scancode von F1  */
	if( iExtended <= 68 )
	/* 68 ist der Scancode von F10 */
	 	printf("Funktionstaste F%d wurde"

		 	"betätigt\n", iExtended —
 58);
	 else
	/* zu welchem if gehört dieses else ? */
		printf("Taste mit Scancode %d", iExtended);
	}
else
	 printf("%c-Taste wurde betätigt", cChar );
	}
.
.

Sobald feststeht, daß eine Sondertaste gedrückt wurde, kann mittels der darauffolgenden if-Anweisung überprüft werden, ob der Wert von iExtendend größer oder gleich 59, also dem Scancode von (F1) ist. Trifft dies zu, dann muß mit einer zusätzlichen if-Anweisung herausgefunden werden, ob nicht der Wert von (F10) überschritten wurde.

Die hier gewählte Vorgangsweise wirkt bereits auf den ersten Blick umständlich und ist relativ schwer zu verstehen. Schließlich wollten wir ja nur die Bedingung formulieren, daß der eingegebenene Wert größer gleich 59 und kleiner gleich 68 sein muß, um herauszufinden, ob überhaupt eine Funktionstaste gedrückt wurde. Genau dieses und stand uns bisher noch nicht zur Verfügung. Es handelt sich dabei um einen logischen Operator.

Auch wenn sich verschachtelte if-Anweisungen für unser Beispiel als umständliche Lösung erweisen, so ist diese Konstruktion doch bei vielen Problemen angemessen oder gar unumgänglich.

Eine tiefe Verschachtelung von if-Statements birgt allerdings die Gefahr, daß bald nicht mehr klar ist, welche Anweisungen zu welchem if gehören. Vor allem verliert man leicht den Überblick darüber, welchem if bestimmte else-Anweisungen zugeordnet sind. Um die Abhängigkeiten der einzelnen if-Anweisungen untereinander ersichtlich zu machen, sollte bei verschachtelten if-Anweisungen für jede Ebene eine Einrückung um einen zusätzlichen Tabulator vorgenommen werden. Dies erleichtert auch die Zuordnung von else-Anweisungen zum jeweiligen if. Für scheinbar verwaiste else gilt, daß ein else prinzipiell dem nächsten vorausgehenden if innerhalb des gleichen Blocks zugeordnet wird, das noch nicht über ein else verfügt.

Sollen Entscheidungen zwischen vielen Alternativen formuliert werden, dann bietet sich für verschachtelte if-Anweisung eine Konstruktion an, die in der C-Literatur manchmal unter dem Stichpunkt else-if auftaucht. Ihr Aufbau stellt sich in allgemeiner Form folgendermaßen dar:


if( Bedingung )
	Ausdruck;
else if( Bedingung )
	Ausdruck;
else if( Bedingung )
	Ausdruck;
else if( Bedingung )
	Ausdruck;
else
	Ausdruck;

Alle Bedingungen werden in der vorliegenden Reihenfolge so lange ausgewertet, bis eine von ihnen zutrifft. In diesem Fall wird die davon abhängige Anweisung ausgeführt und anschließend die Abarbeitung der gesamten else-if Kette beendet. Der letzte else-Zweig wird nur dann berücksichtigt, wenn keine der Bedingungen wahr ist. Diese Tatsache kann man sich zunutze machen, um beispielsweise ungültige Benutzereingaben zu behandeln: Wird nämlich bis zum letzten else keine der Bedingungen erfüllt, dann liegen zum Schluß offensichtlich Fehleingaben vor. Das letzte else kann natürlich auch ganz weggelassen werden, sofern beim Nichtzutreffen aller Bedingungen keine weitere Aktion erfolgen soll. Ein Anwendungsbeispiel für else-if findet sich im folgenden Abschnitt zu den logischen Operatoren.