Die meiste Software verhält sich den Eingaben des Nutzers entsprechend. D.h. der Nutzer kontrolliert den Ablauf des Programms. Damit eine Applikation sich dementsprechend verhält, muss man Bedingungen erfüllen oder nicht erfüllen, um verschiedene Verzweigungen im Code zu betreten.

Bedingte Ausführung mit if ... else

Bisher haben wir nur Programme geschrieben, die seriell abliefen, d.h. es wurde eine Anweisung nach der anderen abgearbeitet – von oben nach unten. Jede Zeile wurde ausgeführt und keine Zeile wurde ignoriert. Aber die meisten Anwendungen funktionieren so nicht. Angenommen ein Programm soll zwei Zahlen multiplizieren, wenn der Nutzer ein m eingibt, oder sie addieren, wenn der Nutzer irgendwas anderes eingibt.

Dieses Szenario ist im folgenden Flußdiagramm dargestellt:

Wie man sehen kann, werden nicht unbedingt alle Pfade ausgeführt. Wenn der User m eingibt, wird der Code ausgeführt, der die beiden Zahlen multipliziert. Bei jeder anderen Eingabe wird die Addition ausgeführt. Es gibt keine einzige Möglichkeit beide Pfade auszuführen.

Diese bedingte Ausführung kann man in C++ mithilfe von if ... else Konstrukten umsetzen:

if (conditional expression)
    Do something when expression true;
else // optional
    Do something else when expression false;

Somit kann man mithilfe von if ... else erreichen, dass das Programm zwei Zahlen multipliziert, wenn der User ein m eingibt und die Zahlen addiert, wenn er etwas anderes eingibt:

if (userSelection == 'n')
    result = num1 * num2;  // multiply
else
    result = num1 + num2;  // add

Das folgende Programm fordert den Nutzer auf zwei Zahlen einzugeben und dann zu entscheiden, ob er diese multipliziert oder addiert haben will.

// ifElse.cpp

#include <iostream>

using namespace std;

int main() {

    cout << "Enter two integers: " << endl;
    int num1 = 0;
    int num2 = 0;
    cin >> num1;
    cin >> num2;

    cout << "Enter \'m\' to multiply, anything else to add: ";
    char userSelection = '\0';
    cin >> userSelection;

    int result = 0;
    if (userSelection == 'm') {
        result = num1 * num2;
    }
    else {
        result = num1 + num2;
    }
    cout << "result is: " << result << endl;

    return 0;
}
Enter two integers: 
12
23
Enter 'm' to multiply, anything else to add: m
result is: 276
Enter two integers:
12
34
Enter 'm' to multiply, anything else to add: x
result is: 46

Der else Teil des if ... else Konstrukts ist natürlich optional und macht nur Sinn, wenn es etwas gibt, dass man Ausführen könnte, falls die Bedingung nicht erfüllt ist.

Außerdem ist es nicht zwingend erforderlich den Code nach der Bedingung oder der else Verzweigung in geschweifte Klammern zu packen, wenn es sich nur um eine Zeile handelt. Da es aber ein häufiger Fehler ist, längere Codeblöcke der Verzeigungen nicht in geschweifte Klammern zu packen, ist es eine gute Angewohnheit dies auch bei Einzeilern zu tun!

Hier sind geschweifte Klammern zwingend erforderlich:

if (condition) {
    // condition success block
    Statement 1;
    Statement 2;
}
else {
    // condition failure block
    Statement 3;
    Statement 4;
}

Verschachtelte if Anweisungen

Es kommt oft vor, dass man einen Ausdruck auf verschiedene Bedingungen testen muss, wobei die folgenden vom Vorgänger abhängig sind. C++ erlaubt daher das Verschachteln solcher Bedingungen:

if (expression1) {
    DoSomething1;
    if (expression2) {
        DoSomething2;
    } 
    else {
        DoSoemthingElse2;
    }
}
else {
    DoSomethingElse1;
}

Mal angenommen wir hätten ein Programm, wie das mit der Multiplikation und Addition von eben. Nun kann der User aber entscheiden, ob er zwei Zahlen dividieren (d) oder multiplizieren (jede andere Eingabe) will. Die Division sollte aber nur erlaubt sein, wenn der Divisor ungleich null ist. Also muss zusätzlich zur Überprüfung der Nutzereingabe, auch geprüft werden, ob der Divisor nicht null ist, falls der Nutzer sich für eine Division entscheidet. Das folgende Programm nutzt hierzu eine verschachteltes if construct:

// mulOrDiv.cpp

#include <iostream>

using namespace std;

int main() {

    cout << "Enter two numbers: " << endl;
    float num1 = 0;
    float num2 = 0;
    cin >> num1;
    cin >> num2;

    cout << "Enter 'd' to divide, anything else to multiply: ";
    char userSelection = '\0';
    cin >> userSelection;

    if (userSelection == 'd') {
        
        cout << "You wish to divide!" << endl;
        if (num2 != 0) {  // if divisor is not zero
            cout << num1 << " / " << num2 << " = "
                 << num1 / num2 << endl;
        }
        else { // if divisor IS zero
            cout << "Division by zero is not allowed" << endl;
        }
    }
    else { // if input was not 'd'
        cout << "You wish to multiply!" << endl;
        cout << num1 << " * " << num2 << " = "
             << num1 * num2 << endl;
    }

    return 0;
}
Enter two numbers:
12
23
You wish to divide!
12 / 23 = 0.521739
Enter two numbers:
12
0
Enter 'd' to divide, anything else to multiply: d
You wish to divide!
Division by zero is not allowed
Enter two numbers:
12
23
Enter 'd' to divide, anything else to multiply: x
You wish to multiply!
12 * 23 = 276

Im nächsten Teil schauen wir uns noch die Verzweigung mit switch an…