Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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-seq
optierendecl-specifier-seqdeclaratorbrace-or-equal-initializer
statement:
expression-statement
compound-statement
expression-statement:
expression
optieren;
compound-statement:
{
statement-seq
optieren}
statement-seq:
statement
statement-seq
statement
if-branch:
statement
else-branch:
statement
selection-statement:
if
constexpr
opt17 opt 17(init-statementopt17condition)if-branch
if
constexpr
opt17 opt 17(init-statementopt17condition)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 *taufrufenShowValue(a);, weiltes sich nicht um einen Zeiger handelt, obwohl dieifAnweisung falsch ist und der Code nie ausgeführt wird. - Wenn Sie einen Fehler
return taufrufenShowValue(pB);, weiltes sich um einen Zeiger handelt, obwohl dieifAnweisung 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
Selection-Anweisungen
Schlüsselwörter
switch Anweisung (C++)