Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Příkaz if-else řídí podmíněné větvení. Příkazy v řetězci if-branch se provádějí pouze v případě condition , že se vyhodnotí jako nenulová hodnota (nebo true). Pokud je hodnota condition nenulová, provede se následující příkaz a příkaz následující po volitelném else se přeskočí. V opačném případě se následující příkaz přeskočí a pokud je příkaz else následující po else spuštění.
condition výrazy, které se vyhodnotí jako nenulové, jsou:
true- nenulový ukazatel,
- jakékoli nenulové aritmetické hodnoty nebo
- typ třídy, který definuje jednoznačný převod na aritmetický, logický nebo typ ukazatele. (Informace o převodech naleznete v tématu Standardní převody.)
Syntaxe
init-statement:
expression-statement
simple-declaration
condition:
expression
attribute-specifier-seq
volitdecl-specifier-seqdeclaratorbrace-or-equal-initializer
statement:
expression-statement
compound-statement
expression-statement:
expression
volit;
compound-statement:
{
statement-seq
volit}
statement-seq:
statement
statement-seq
statement
if-branch:
statement
else-branch:
statement
selection-statement:
if
constexpr
opt17(init-statementopt17condition)if-branch
if
constexpr
opt17(init-statementopt17condition)if-branchelseelse-branch
17 Tento volitelný prvek je k dispozici od C++17.
příkazy if-else
Ve všech formách if příkazu, conditionkteré mohou mít libovolnou hodnotu s výjimkou struktury, se vyhodnotí, včetně všech vedlejších účinků. Ovládací prvek předá z if příkazu do dalšího příkazu v programu, pokud není proveden if-branch nebo else-branch neobsahuje , breakcontinuenebo goto.
Klauzule elseif...else příkazu je přidružena k nejbližšímu předchozímu if příkazu ve stejném oboru, který nemá odpovídající else příkaz.
Příklad
Tento ukázkový kód ukazuje několik if příkazů, které se používají, a to jak s, tak bez 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
}
}
Výstup:
x < 11 is true!
25
if – příkaz s inicializátorem
Počínaje jazykem if C++17 může příkaz obsahovat init-statement také výraz, který deklaruje a inicializuje pojmenovanou proměnnou. Tuto formu příkazu if použijte, pokud je proměnná potřebná pouze v rozsahu příkazu if-statement.
Specifické pro Microsoft: Tento formulář je k dispozici od sady Visual Studio 2017 verze 15.3 a vyžaduje alespoň možnost kompilátoru /std:c++17 .
Příklad
// 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";
}
}
Výstup:
ten
x is 42
setting shared_flag to false
Error! Token must not be a keyword
if constexpr – příkazy
Počínaje jazykem C++17 můžete pomocí if constexpr příkazu v šablonách funkcí provádět rozhodnutí o větvení v čase kompilace, aniž byste se museli uchylovat k přetížení více funkcí.
Specifické pro Microsoft: Tento formulář je k dispozici od sady Visual Studio 2017 verze 15.3 a vyžaduje alespoň možnost kompilátoru /std:c++17 .
Příklad
Tento příklad ukazuje, jak můžete podmíněně zkompilovat šablonu na základě typu odeslaného do ní:
// 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"
}
Příkaz if constexpr se vyhodnocuje v době kompilace a kompilátor generuje kód pouze pro if větev, která odpovídá typu argumentu odeslaného do šablony funkce. Pokud zakomentujete if constexpr příkaz a zrušíte komentář if příkazu, kompilátor vygeneruje kód pro obě větve. To znamená, že se zobrazí chyba:
- Pokud zavoláte
ShowValue(a);chybureturn *t, protožetnení ukazatel, i kdyžifje příkaz false a kód se nikdy nespustí. - Pokud zavoláte
ShowValue(pB);chybureturn t, protožetje ukazatel, i kdyžifje příkaz pravdivý a kód se nikdy nespustí.
Použití if constexpr řeší tento problém, protože se kompiluje pouze příkaz, který odpovídá typu argumentu odeslaného do šablony funkce.
Výstup:
42
42