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-seq
optdecl-specifier-seq
declarator
brace-or-equal-initializer
statement
:
expression-statement
compound-statement
expression-statement
:
expression
opt;
compound-statement
:
{
statement-seq
opt}
statement-seq
:
statement
statement-seq
statement
if-branch
:
statement
else-branch
:
statement
selection-statement
:
if
constexpr
opt 17 opt17init-statement
(
opt17condition
)
if-branch
if
constexpr
opt 17 opt17init-statement
(
opt17condition
)
if-branch
else
else-branch
17 Dieses optionale Element ist ab C++17 verfügbar.
if-else-Anweisungen
In allen Formen der if
Anweisung, condition
die 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
, continue
oder 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);
, weilt
es sich nicht um einen Zeiger handelt, obwohl dieif
Anweisung falsch ist und der Code nie ausgeführt wird. - Wenn Sie einen Fehler
return t
aufrufenShowValue(pB);
, weilt
es sich um einen Zeiger handelt, obwohl dieif
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
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für