if-else-Anweisung (C++)

Eine if-else-Anweisung steuert die bedingte Verzweigung. Anweisungen in der if-branch Werden nur ausgeführt, wenn die condition Werte zu einem Wert ungleich Null (oder true) ausgewertet werden. Wenn der Wert von condition "nonzero" ist, wird die folgende Anweisung ausgeführt, und die Anweisung, die auf die optionale else Anweisung folgt, wird übersprungen. Andernfalls wird die folgende Anweisung übersprungen, und wenn eine else Anweisung vorhanden ist, die auf die else ausführung folgt.

condition Ausdrücke, die als "Nonzero" ausgewertet werden, sind:

  • true
  • ein Nicht-Null-Zeiger,
  • beliebiger nichtzero arithmetischer Wert oder
  • ein Klassentyp, der eine eindeutige Konvertierung in einen arithmetischen, booleschen oder Zeigertyp definiert. (Informationen zu Konvertierungen finden Sie unter Standardkonvertierungen.)

Syntax

init-statement:
expression-statement
simple-declaration

condition:
expression
attribute-specifier-seqoptdecl-specifier-seqdeclaratorbrace-or-equal-initializer

statement:
expression-statement
compound-statement

expression-statement:
expressionopt;

compound-statement:
{statement-seqopt}

statement-seq:
statement
statement-seq statement

if-branch:
statement

else-branch:
statement

selection-statement:
ifconstexpropt 17 opt17init-statement(opt17condition)if-branch
ifconstexpropt 17 opt17init-statement(opt17condition)if-branchelseelse-branch

17 Dieses optionale Element ist ab C++17 verfügbar.

if-else-Anweisungen

In allen Formen der if Anweisung, conditiondie einen beliebigen Wert außer einer Struktur aufweisen kann, wird ausgewertet, einschließlich aller Nebenwirkungen. Control übergibt die if Anweisung an die nächste Anweisung im Programm, es sei denn, die ausgeführte if-branch oder else-branch enthält ein break, continueoder goto.

Die else Klausel einer if...else Anweisung ist mit der nächstgelegenen vorherigen if Anweisung im selben Bereich verknüpft, die keine entsprechende else Anweisung hat.

Beispiel

Dieser Beispielcode zeigt mehrere if verwendete Anweisungen, sowohl mit als auch ohne else:

// if_else_statement.cpp
#include <iostream>

using namespace std;

int main()
{
    int x = 10;

    if (x < 11)
    {
        cout << "x < 11 is true!\n";  // executed
    }
    else
    {
        cout << "x < 11 is false!\n"; // not executed
    }

    // no else statement
    bool flag = false;
    if (flag == true)
    {
        x = 100; // not executed
    }

    int *p = new int(25);
    if (p)
    {
        cout << *p << "\n"; // outputs 25
    }
    else
    {
        cout << "p is null!\n"; // executed if memory allocation fails
    }
}

Ausgabe:

x < 11 is true!
25

if-Anweisung mit einem Initialisierer

Ab C++17 kann eine if Anweisung auch einen init-statement Ausdruck enthalten, der eine benannte Variable deklariert und initialisiert. Verwenden Sie diese Form der If-Anweisung, wenn die Variable nur innerhalb des Bereichs der If-Anweisung erforderlich ist. Microsoft-spezifisch: Dieses Formular ist ab Visual Studio 2017, Version 15.3, verfügbar und erfordert mindestens die /std:c++17 Compileroption.

Beispiel

// Compile with /std:c++17

#include <iostream>
#include <mutex>
#include <map>
#include <string>
#include <algorithm>

using namespace std;

map<int, string> m{ {1, "one"}, {2, "two"}, {10,"ten"} };
mutex mx;
bool shared_flag = true; // guarded by mx
int getValue() { return 42; }

int main()
{
    if (auto it = m.find(10); it != m.end())
    {
        cout << it->second << "\n";
    }

    if (int x = getValue(); x == 42)
    {
        cout << "x is 42\n";
    }

    if (lock_guard<mutex> lock(mx); shared_flag)
    {
        cout << "setting shared_flag to false\n";
        shared_flag = false;
    }

    string s{ "if" };
    if (auto keywords = { "if", "for", "while" }; any_of(keywords.begin(), keywords.end(), [&s](const char* kw) { return s == kw; }))
    {
        cout << "Error! Token must not be a keyword\n";
    }
}

Ausgabe:

ten
x is 42
setting shared_flag to false
Error! Token must not be a keyword

if constexpr statements

Ab C++17 können Sie eine if constexpr Anweisung in Funktionsvorlagen verwenden, um Kompilierungszeitverzweigungsentscheidungen zu treffen, ohne auf mehrere Funktionsüberladungen zurückgreifen zu müssen. Microsoft-spezifisch: Dieses Formular ist ab Visual Studio 2017, Version 15.3, verfügbar und erfordert mindestens die /std:c++17 Compileroption.

Beispiel

In diesem Beispiel wird gezeigt, wie Sie eine Vorlage basierend auf dem an sie gesendeten Typ bedingt kompilieren können:

// Compile with /std:c++17
#include <iostream>

template<typename T>
auto Show(T t)
{
    //if (std::is_pointer_v<T>) // Show(a) results in compiler error for return *t. Show(b) results in compiler error for return t.
    if constexpr (std::is_pointer_v<T>) // This statement goes away for Show(a)
    {
        return *t;
    }
    else
    {
        return t;
    }
}

int main()
{
    int a = 42;
    int* pB = &a;

    std::cout << Show(a) << "\n"; // prints "42"
    std::cout << Show(pB) << "\n"; // prints "42"
}

Die if constexpr Anweisung wird zur Kompilierungszeit ausgewertet, und der Compiler generiert nur Code für die if Verzweigung, die dem Typ des Arguments entspricht, das an die Funktionsvorlage gesendet wird. Wenn Sie die if constexpr Anweisung kommentieren und die Kommentare der if Anweisung aufheben, generiert der Compiler Code für beide Verzweigungen. Dies bedeutet, dass Sie eine Fehlermeldung erhalten:

  • Wenn Sie einen Fehler return *t aufrufenShowValue(a);, weil t es sich nicht um einen Zeiger handelt, obwohl die if Anweisung falsch ist und der Code nie ausgeführt wird.
  • Wenn Sie einen Fehler return t aufrufenShowValue(pB);, weil t es sich um einen Zeiger handelt, obwohl die if Anweisung wahr ist und der Code nie ausgeführt wird.

Die Verwendung if constexpr dieses Problems wird behoben, da nur die Anweisung, die dem Typ des arguments entspricht, das an die Funktionsvorlage gesendet wird, kompiliert wird.

Ausgabe:

42
42

Siehe auch

Auswahlanweisungen
Schlüsselwörter
switch-Anweisung (C++)