Les structures conditionnelles (if et switch) en C++ (C++17 et C++20)
Certains problèmes ne peuvent pas être résolus avec seulement une séquence d'instructions simples. Parfois, nous devons tester une condition. Si le résultat du test est vrai, nous suivons une séquence d'instructions : s'il est faux, nous suivons une séquence d'instructions différente. C'est ce qu'on appelle la construction conditionnelle décision (ou décisionnelle).
Structure de contrôle if-else
L'instruction if ne s'exécutera que si l'expression entre parenthèses est évaluée comme étant true. En C++, il n'est pas nécessaire que ce soit une expression booléenne. Il peut s'agir de n'importe quelle expression qui évalue un nombre, auquel cas zéro est false et tous les autres nombres sont true.
Syntaxe
if (/* expression */) { /* Exécuter uniquement si la expression est vraie */ }
Exemple 1
if(x > 1) { cout << x << " > 1"; }
Pour tester d'autres conditions, l'instruction if peut être étendue par n'importe quel nombre d'instructions else if.
Exemple 2
else if(x < 1) { cout << x << " < 1"; }
L'instruction if peut avoir une instruction else facultative à la fin, qui s'exécutera si toutes les conditions précédentes sont fausses.
Exemple 3
else { cout << x << " = 1"; }
Quant aux accolades, elles peuvent être omises si une seule instruction doit être exécutée de manière conditionnelle. Toutefois, Elle est considérée comme une bonne pratique de les inclure car elles améliorent la lisibilité du code.
La syntaxe complète de if est la suivante :
Syntaxe
if (condition-1) { // Exécuter seulement si la condition-1 est vraie } else if (condition-2) { // optional // Exécuter seulement si la condition-2 est vraie } // ... autant de "else if" que souhaité } else { // facultatif // Exécuter seulement si aucune des conditions ci-dessus n'est vraie. }
Exemple 4
if (x < 1) cout << x << " < 1"; else if (x > 1) cout << x << " > 1"; else cout << x << " == 1";
Structure de contrôle IF avec initialiseur
Il existe plusieurs instructions en C++ dont la syntaxe a été modifiée dans les versions récentes de la norme. Avec la norme C++17, la syntaxe de IF et Switch a été modifiée, par l'introduction de l'instruction init
Vous pouvez lier la portée d'un objet à une instruction if en ajoutant une instruction init aux déclarations if et else if, comme suit :
La partie init est facultative et, si elle est manquante, nous avons la forme régulière (ou traditionnelle) de l'instruction.
Syntaxe
if (init; condition-1) { // Exécuter seulement si la condition-1 est vraie } else if (init; condition-2) { // Exécuter seulement si la condition-2 est vraie }
Exemple 5
Supposons que nous voulions vérifier si un nombre aléatoire est pair ou impair. Avant C++17, notre code ressemblait à ceci :
#include <iostream> #include <cstdlib> using namespace std; int main() { srand(time(NULL)); int nombre_alea = rand(); if (nombre_alea % 2 == 0) { cout << nombre_alea << " est pair\n"; } else { cout << nombre_alea << " est impair\n"; } return 0; }
Dans l'exemple ci-dessus, nous pouvons voir que la variable "nombre_alea" est divulguée en dehors de la portée if-else. Nous pouvons facilement éviter cela avec la nouvelle syntaxe if.
Et voici comment l'exemple ci-dessus peut être simplifié avec des instructions init en C++17 :
Exemple 6
#include <iostream> #include <cstdlib> using namespace std; int main() { srand(time(NULL)); if (int nombre_alea = rand();nombre_alea % 2 == 0) { cout << nombre_alea << " est pair\n"; } else { cout << nombre_alea << " est impair\n"; } return 0; }
Une déclaration de la forme if(init; condition) instructions; est équivalent à ce qui suit :
init; if(condition) instructions;
Par conséquent, la ou les variables (parce que vous pouvez définir plusieurs variables du même type, séparées par des virgules) sont déclarées dans une portée qui englobe immédiatement l'instruction if. Cela signifie qu'ils sont disponibles non seulement dans l'instruction if, mais également dans toutes les instructions else-if qui en découlent. Ceux-ci peuvent avoir d'autres instructions init, mais vous ne pouvez pas redéclarer une variable déclarée dans le même if.
Exemple 7
if (int a = val1(); a > 0) cout << "a > 0 '\n"; else if(float b = val2(); b > 0) cout << "b > 0 '\n";
Ce code est transformé par le compilateur sous la forme suivante :
Exemple 8
int a=val1(); if (a > 0) cout << "a > 0 '\n"; else{ float b = val2(); if(b > 0) cout << "b > 0 '\n"; }
Vous pouvez utiliser cette syntaxe avec des liaisons structurées pour produire une gestion élégante des erreurs.
Structure de contrôle switch
L'instruction switch vérifie l'égalité entre un entier et une série d'étiquettes de cas (case), puis passe l'exécution au cas correspondant. Elle peut contenir un nombre quelconque de clauses de cas ainsi qu'une étiquette par défaut pour traiter tous les autres cas.
À l'aide de l'instruction switch, nous pouvons tester la valeur d'une expression. L'instruction de sélection (l'instruction switch) est similaire à l'instruction conditionnelle, sauf qu'il n'y a que deux alternatives dans l'instruction conditionnelle (la condition peut être vraie ou fausse). Dans l'instruction de sélection, le nombre d'autres options peut être supérieur à deux. L'expression testée dans l'instruction de sélection peut être de type int (un nombre entier) ou char (un caractère).
Syntaxe
switch(expression) { case val1: instruction1; instruction2; ... break; case val2: instruction3; instruction4; ... break; case val3: instruction5; instruction6; ... break; default: instruction7; ... break; }
Le mot-clé switch est suivi entre parenthèses d'une expression à tester. Ensuite, dans le corps de l'instruction de sélection (entre accolades), suivent les sections de cas (case). Chaque section de cas contienne une valeur de contrôle à comparer à l'expression testée. Les sections comprennent des instructions, qui doivent être exécutées lorsque la coïncidence a lieu. Comme d'habitude, chaque section de cas se termine par l'instruction break. L'instruction de sélection peut également contenir la section par défaut, default (la dernière section de l'instruction switch). Les instructions de la section par défaut sont exécutées lorsqu'il n'existe aucune section de cas dont la valeur de contrôle coïncide avec la valeur de l'expression testée.
Exemple 9
int addition(int x, int y){ return x+y; } int a; float b; char c; switch(a){ // valide } switch(c){ // valide } switch(b){ // invalide (valeur réelle) } switch(2+3){ // valide } switch(a+c){ // valide } switch(a+4){ // valide } switch("nom"){ // invalide (chaine de caractères) } switch(addition(a,2)){ // valide }
Exemple 9
voici un programme qui à partir d'un nombre compris entre 1 et 7 affiche le jour correspondant
#include <iostream> using namespace std; int main(void){ int jour; cin >> jour; switch(jour){ case 1 : cout << "Lundi \n";break; case 2 : cout << "Mardi \n";break; case 3 : cout << "Mercredi \n";break; case 4 : cout << "Jeudi \n";break; case 5 : cout << "Vendredi \n";break; case 6 : cout << "Samedi \n";break; case 7 : cout << "Dimanche \n";break; default: cout << "jour invalide \n";break; } return 0; }
Structure de contrôle switch avec initialiseur
Comme nous l'avons vu pour l'instruction if-else, l'instruction switch peut également avoir un initialiseur à partir de la norme C++17
Syntaxe
switch (init; variable) { .... // cas }
Exemple 10
#include <iostream> using namespace std; int lireValeur(){ int a; cin >> a; return a; } int main(void){ switch(int a=lireValeur() ; a){ case 1 : cout << "Lundi \n";break; case 2 : cout << "Mardi \n";break; case 3 : cout << "Mercredi \n";break; case 4 : cout << "Jeudi \n";break; case 5 : cout << "Vendredi \n";break; case 6 : cout << "Samedi \n";break; case 7 : cout << "Dimanche \n";break; default: cout << "jour invalide \n";break; } return 0; }