C++ Kurs

if-Verzweigung

Die Themen:

Syntax

Die if-Verzweigung wird immer dann eingesetzt, wenn in Abhängigkeit von Bedingungen verschiedene Anweisungen auszuführen sind. Sie hat folgende Syntax:

if (AUSDRUCK)
   ANWEISUNG1 // IF-Zweig
else
   ANWEISUNG2 // ELSE-Zweig

AUSDRUCK kann ein beliebiger C++ Ausdruck sein, der entweder ein ganzzahliges oder ein boolsches Ergebnis liefert. Der Ausdruck muss immer in runden Klammern stehen und in der Regel steht hier ein Vergleichs- oder Logikausdruck.

Ergibt die Auswertung des Ausdrucks true (oder einen Wert ungleich 0), so wird die Anweisung ANWEISUNG1 ausgeführt, in allen anderen Fällen wird die Anweisung ANWEISUNG2 ausgeführt.


// Ausdruck mit logischem Vergleich
if (var == 10)      // Falls var gleich 10
   var = 0;         // var auf 0 setzen
else                // sonst
   var++;           // var inkrementieren

//Ausdruck mit ganzzahligem Vergleich
if (var)            // Falls var ungleich 0 (=true!)
   cout << "ungleich Null";
else                // sonst
   cout << "gleich Null";
Nach dem Ausdruck der if-Abfrage darf kein Semikolon stehen. Wird hier ein Semikolon gesetzt, so gilt dies als leere Anweisung, d.h. bei erfüllter Bedingung wird einfach nichts ausgeführt!

Auszuführende Anweisungen

Standardmäßig folgt auf ein if oder else nur eine Anweisung, so wie im vorherigen Beispiel dargestellt. Sollen mehrere Anweisungen in Abhängigkeit von der Bedingung ausgeführt werden, so sind die Anweisungen in einen Block {...} einzuschließen. Dabei sollte aber auf eine saubere Formatierung geachtet werden, damit das Programm lesbar bleibt.


if (var == 10)
{
   var = 0;
   cout << "var auf 0 gesetzt";
}
else
{
   var++;
   cout << "var jetzt:" << var;
}
cout << endl;

Der else-Zweig ist optional. Ist er nicht vorhanden und die Auswertung des Ausdrucks ergibt false, so wird mit der nächsten Anweisung nach dem if-Zweig fortgefahren. Im nachfolgenden Beispiel wird die Variable var nur dann dekrementiert, wenn deren Inhalt ungleich 0 ist.


if (var != 0)
{
   var--;
   cout << "var dekrementiert.";
}
cout << "var jetzt:" << var << endl;

Innerhalb eines if- oder else-Zweigs sind alle C++ Anweisungen zulässig. So können in einem Zweig weitere if-Anweisungen folgen oder auch Variablen definiert werden. Diese Variablen sind dann aber nur innerhalb des Zweigs gültig.


if (var > 0)
{
   decltype(var) temp = var % 5;
   if (temp)                // falls temp ungleich 0
   {
      ...                   // Führe beliebige Anweisungen aus
   }
}
cout << "var jetzt:" << var << endl;
Sehen Sie sich einmal die beiden folgenden if-Anweisungen genau an:
if (var == 10)
    ....
if (var = 10)
    ....

Beide Anweisungen sind syntaktisch richtig! Im ersten Fall wird die Variable var mit dem Wert 10 verglichen und in Abhängigkeit davon werden weitere Anweisungen ausgeführt. Im zweiten Fall wird der Variablen var der Wert 10 zugewiesen und das Ergebnis der Zuweisung ausgewertet. Und da var danach ungleich 0 (und somit true) ist, werden die Anweisungen im if-Zweig immer ausgeführt.

Mehrere Bedingungen

Bisher enthielten die if-Anweisungen immer nur eine Bedingung. Jedoch können auch mehrere Bedingung in einer if-Anweisung ausgewertet werden Die Bedingungen sind dann mit logischen Operatoren zu verknüpfen. Das nachfolgende Beispiel zeigt, wie eine if-Anweisung mit mehrere Bedingungen definiert wird.


// Hier müssen beide Bedingungen erfüllt sein
if ((var == 10) && (count != 0))
   ....

// Hier genügt es, wenn eine Bedingung erfüllt ist
if ((var == 10) || (count != 0))
   ....

Die Klammern um die einzelnen Bedingungen sind zwar nicht vorgeschrieben, jedoch sehr empfehlenswert. Sie erleichtert den Überblick über die einzelnen Bedingungen und außerdem gibt es dann keine bösen Überraschungen in Bezug auf die Reihenfolge der Auswertung der einzelnen Operatoren. Oder wissen Sie noch, ob der GLEICH-Operator (==) vor dem UND-Operator (&&) ausgewertet wird oder umgekehrt?

Und noch ein Hinweis: die Anzahl der Bedingungen in einer if-Anweisung ist zwar nicht begrenzt, jedoch leidet die Übersichtlichkeit erheblich wenn sehr viele Bedingungen in einer if-Anweisung verarbeitet werden.

Die Anweisung
if ((AUSDRUCK1) & (AUSDRUCK2))

ist syntaktisch richtig und erzeugt somit auch keinen Fehler beim Übersetzen des Programms. Hier werden die beiden Ausdrücke aber bitweise verundet und nicht logisch (was vermutlich erfolgen sollte).

Bedingungsoperator und goto

Eine etwas abgewandelte Form der if-Anweisung stellt der Bedingungsoperator dar, der folgende Syntax besitzt:

erg = (AUSDRUCK1) ? AUSDRUCK2 : AUSDRUCK3;

Liefert die Auswertung des Ausdrucks AUSDRUCK1 als Ergebnis true, so wird AUSDRUCK2 ausgewertet und das Ergebnis der Variablen erg zugewiesen. Liefert AUSDRUCK1 dagegen false, wird das Ergebnis von AUSDRUCK3 der Variablen erg zugewiesen. Das folgende Beispiel zeigt unter anderem, wie mit Hilfe dieser Anweisung der Absolutbetrag einer Variablen 'berechnet' werden kann. Außerdem ist eine weitere, etwas unkonventionellere, if-Abfrage aufgeführt, die je nach Zustand der Variablen light entweder den Text Das Licht ist an oder den Text Das Licht ist aus ausgibt.


// Absolutbetrag von var1 in var2 ablegen
var2 = (var1>0) ? var1 : -var1;
// Alternative Schreibweise:
//   if (var1>0)
//        var2 = var1;
//   else
//      var2 = -var1;


// Weiteres (unkonventionelles) Beispiel:
cout << "Das Licht ist " << ((light)? "an" : "aus") << endl;

Nur der Vollständigkeit halber sei an dieser Stelle noch erwähnt, dass C++ auch eine goto-Anweisung kennt. Sie hat folgende Syntax:

if (...)          // Falls Bedingung erfüllt
   goto label;    // Sprung nach label
...
label:            // Das Sprungziel
...

Das Sprungziel kann ein beliebiger, eindeutiger Namen sein und muss mit einem Doppelpunkt abgeschlossen werden. Für die Position des Sprungziels gibt es eine Reihe von Einschränkungen, die wir uns hier aber nicht ansehen wollen. In einem 'sauberen' Programm kommt man ohne goto aus. Wie die goto-Anweisung eingesetzt werden kann, das können Sie sich im Beispiel noch ansehen.

Beispiel und ÜbungUnd hier geht's zum Beispiel und zur Übung.