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-seq
optdecl-specifier-seq
declarator
brace-or-equal-initializer
statement
:
expression-statement
compound-statement
expression-statement
:
expression
opt;
compound-statement
:
{
statement-seq
opt}
statement-seq
:
statement
statement-seq
statement
if-branch
:
statement
else-branch
:
statement
selection-statement
:
if
constexpr
opt17(
init-statement
opt17condition
)
if-branch
if
constexpr
opt17(
init-statement
opt17condition
)
if-branch
else
else-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 surreturn *t
, cart
n’est pas un pointeur, même si l’instructionif
est false et que le code n’est jamais exécuté. - Si vous appelez
ShowValue(pB);
, une erreur s’affiche surreturn t
, cart
il s’agit d’un pointeur, même si l’instructionif
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++)
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de l’année 2024, nous abandonnerons progressivement le mécanisme de retour d’information GitHub Issues pour le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultez :Soumettre et afficher des commentaires pour