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-seqRozhodnoutdecl-specifier-seqdeclaratorbrace-or-equal-initializer

statement:
expression-statement
compound-statement

expression-statement:
expressionRozhodnout;

compound-statement:
{statement-seqRozhodnout}

statement-seq:
statement
statement-seq statement

if-branch:
statement

else-branch:
statement

selection-statement:
ifconstexpropt17init-statement(opt17condition)if-branch
ifconstexpropt17init-statement(opt17condition)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); chybu return *t , protože t není ukazatel, i když if je příkaz false a kód se nikdy nespustí.
  • Pokud zavoláte ShowValue(pB); chybu return t , protože t 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é

Příkazy výběru
Klíčová slova
switch Příkaz (C++)