Partage via


instruction if-else (C++)

Une instruction if-else contrôle le branchement conditionnel. Les instructions dans le fichier if-branch sont exécutées uniquement si la valeur condition est différente de zéro (ou true). Si la valeur de condition est différente de 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 y a un else, l'instruction qui suit le else est exécutée.

Les expressions condition 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:
ifconstexpropt17(init-statementopt17condition)if-branch
ifconstexpropt17(init-statementopt17condition)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, condition, qui 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, continue ou goto.

La clause else d’une instruction if...else est associée à l’instruction if précédente 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 instructions if 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

Instruction if avec un initialiseur

À compter de C++17, une instruction if peut également contenir une expression init-statement 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 compilateur /std:c++17.

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

Instructions if constexp

À compter de C++17, vous pouvez utiliser une instruction if constexpr 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 compilateur /std:c++17.

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 branche if 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 s’affiche sur 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 s’affiche sur 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++)