if-else – příkaz (C++)
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 najdete v tématu Standardní převody.)
Syntaxe
init-statement
:
expression-statement
simple-declaration
condition
:
expression
attribute-specifier-seq
Rozhodnoutdecl-specifier-seq
declarator
brace-or-equal-initializer
statement
:
expression-statement
compound-statement
expression-statement
:
expression
Rozhodnout;
compound-statement
:
{
statement-seq
Rozhodnout}
statement-seq
:
statement
statement-seq
statement
if-branch
:
statement
else-branch
:
statement
selection-statement
:
if
constexpr
opt17init-statement
(
opt17condition
)
if-branch
if
constexpr
opt17init-statement
(
opt17condition
)
if-branch
else
else-branch
17 Tento volitelný prvek je k dispozici od C++17.
příkazy if-else
Ve všech formách if
příkazu, condition
které 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 , break
continue
nebo goto
.
Klauzule else
if...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žet
není ukazatel, i kdyžif
je příkaz false a kód se nikdy nespustí. - Pokud zavoláte
ShowValue(pB);
chybureturn t
, protožet
je ukazatel, i kdyžif
je 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
Viz také
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro