if-else, instruction (C++)

Une instruction if-else contrôle la branche conditionnelle. Les instructions dans le if-branch fichier sont exécutées uniquement si la condition valeur est différente de zéro (ou true). Si la valeur est différente de condition zéro, l’instruction suivante est exécutée et l’instruction qui suit l’option else est ignorée. Sinon, l’instruction suivante est ignorée et, s’il existe une else instruction qui suit, elle else est exécutée.

condition les expressions qui évaluent la valeur différente de zéro sont les suivantes :

  • true
  • un pointeur non null,
  • toute valeur arithmétique différente de zéro, ou
  • type de classe qui définit une conversion non ambiguë en type arithmétique, booléen ou pointeur. (Pour plus d’informations sur les conversions, consultez Conversions standard.)

Syntaxe

init-statement:
expression-statement
simple-declaration

condition:
expression
attribute-specifier-seqoptdecl-specifier-seqdeclaratorbrace-or-equal-initializer

statement:
expression-statement
compound-statement

expression-statement:
expressionopt;

compound-statement:
{statement-seqopt}

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 Cet élément facultatif est disponible à partir de C++17.

instructions if-else

Dans toutes les formes de l’instruction if , conditionqui peut avoir n’importe quelle valeur à l’exception d’une structure, est évaluée, y compris tous les effets secondaires. Le contrôle passe de l’instruction if à l’instruction suivante dans le programme, sauf si l’exécution if-branch ou else-branch contient un break, ou continuegoto.

La else clause d’une if...else instruction est associée à l’instruction précédente if la plus proche dans la même étendue que celle qui n’a pas d’instruction correspondante else .

Exemple

Cet exemple de code montre plusieurs if instructions en cours d’utilisation, avec et sans 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
    }
}

Sortie :

x < 11 is true!
25

if, instruction avec un initialiseur

À compter de C++17, une if instruction peut également contenir une init-statement expression qui déclare et initialise une variable nommée. Utilisez cette forme d’instruction if-quand la variable est nécessaire uniquement dans l’étendue de l’instruction if-. Spécifique à Microsoft : ce formulaire est disponible à partir de Visual Studio 2017 version 15.3 et nécessite au moins l’option du /std:c++17 compilateur.

Exemple

// 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";
    }
}

Sortie :

ten
x is 42
setting shared_flag to false
Error! Token must not be a keyword

si des instructions constexpr

À compter de C++17, vous pouvez utiliser une if constexpr instruction dans les modèles de fonction pour prendre des décisions de branchement au moment de la compilation sans avoir à recourir à plusieurs surcharges de fonction. Spécifique à Microsoft : ce formulaire est disponible à partir de Visual Studio 2017 version 15.3 et nécessite au moins l’option du /std:c++17 compilateur.

Exemple

Cet exemple montre comment compiler conditionnellement un modèle en fonction du type envoyé à celui-ci :

// 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"
}

L’instruction if constexpr est évaluée au moment de la compilation et le compilateur génère uniquement du code pour la if branche qui correspond au type de l’argument envoyé au modèle de fonction. Si vous commentez l’instruction if constexpr et supprimez les marques de commentaire de l’instruction if , le compilateur génère du code pour les deux branches. Cela signifie que vous obtenez une erreur :

  • Si vous appelez ShowValue(a); une erreur return *t car t n’est pas un pointeur, même si l’instruction if est false et que le code n’est jamais exécuté.
  • Si vous appelez ShowValue(pB); une erreur return t car t il s’agit d’un pointeur, même si l’instruction if est vraie et que le code n’est jamais exécuté.

L’utilisation if constexpr résout ce problème, car seule l’instruction qui correspond au type de l’argument envoyé au modèle de fonction est compilée.

Sortie :

42
42

Voir aussi

Instructions de sélection
Mots clés
Instruction switch (C++)