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-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
opt17init-statement
(
opt17condition
)
if-branch
if
constexpr
opt17init-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
, ou continue
goto
.
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 erreurreturn *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 erreurreturn 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 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour