• Aucun résultat trouvé

Tester plusieurs expressions

Dans le document La programmation en C++ moderne (Page 75-79)

Contenu masqué n°5

II.5.8. Tester plusieurs expressions

Nous ne sommes absolument pas limités à tester deux expressions en même temps. On peut le faire avec trois, quatre, dix, soixante (bien que soixante soit un exemple extrême et vraiment

1 #include <iostream>

23 int main() 4 {

5 bool const ai_je_envie_de_nager{ true };

6 bool const ai_je_un_maillot { true };

7 int const argent { 20 };

8 int const prix { 5 };

109 if (ai_je_envie_de_nager && ai_je_un_maillot && argent >= prix)

11 {

12 std::cout << "PLOUF !" << std::endl;

13 }

14 else

15 {

16 std::cout << "Huum, un autre jour." << std::endl;

17 }

1819 return 0;

20 }

Dans le cas du même opérateur, ils sont évalués de gauche à droite. C’est le cas du code précédent. Mais que se passe t-il si l’on mélange plusieurs opérateurs différents dans la même expression? Sauriez-vous dire ce que quelque chose commeexpression1 && expression 2 || expression3 va donner? En effet, les opérateurs logiques sont comme les opérateurs mathématiques que nous avons vus dans les chapitres précédents: ils ont une priorité.

1. Le plus prioritaire, c’est la négation !. 2. Ensuite vient le «ET» &&.

3. Enfin, le «OU» || est le moins prioritaire.

Ainsi, dans l’exemple !a && b, c’est d’abord !aqui est évalué, puis la nouvelle valeur et b sont testées avec l’opérateur ET &&. Avec le code a && b || c && d, dans l’ordre, on évalue a && b, c && d et enfina && b || c && d.

Bien que la priorité des opérateurs soit clairement définie par C++, une bonne pratique consiste à ajouter des parenthèses autour des expressions pour rendre le code plus lisible et plus clair. Si l’on reprend nos exemples, cela donne (!a) && b pour le premier et (a && b) || (c

&& d) pour le deuxième. C’est clair? Prouvez-le-moi en mettant les parenthèses au bon endroit dans ces codes (piqués à @gbdivers).

1 a && b && c 2 a || b || c 3 a || b && c 4 a && b || c 5

6 !a && b

À partir de maintenant, je vais mettre des parenthèses dans le code pour le rendre clair et explicite.

II.5.8.1. Évaluation en court-circuit

Imaginez un formulaire à remplir, avec de multiples questions, pour demander une place de parking dans votre immeuble. Pour ça, il faut déjà habiter l’immeuble en question et avoir une voiture. Si vous habitez ailleurs, pas la peine de réfléchir à la possession ou non d’une voiture, vous êtes inéligible pour cette place de parking.

Eh bien le compilateur mène le même raisonnement quand il évalue une expression constituée de

«AND». S’il détecte qu’une condition est fausse, alors il ne sert à rien d’évaluer le reste de l’expressionpuisque le résultat est forcément faux. Si vous ne voyez pas pourquoi, retournez un peu plus haut jeter un œil à la table de vérité de «AND».

1 #include <iostream>

2

3 int main() 4 {

5 bool const ai_je_une_voiture { false };

6 bool const habite_immeuble { true };

78 // Comme ai_je_une_voiture vaut false, le compilateur ne va pas tester l'expression habite_immeuble.

9 if (ai_je_une_voiture && habite_immeuble)

10 {

11 std::cout << "Voici votre place de parking." << std::endl;

12 }

13 else

14 {

15 std::cout << "Désolé, vous n'êtes pas éligible." <<

std::endl;

16 }

17

18 return 0;

19 }

Avec l’opérateur «OR», le même principe s’applique: si l’une des expressions est évaluée à true, alors, selon la table de vérité de l’opérateur «OR», le résultat sera true, donc pas la peine d’évaluer le reste.

Ce principe d’optimisation par le compilateur s’appelle l’évaluation en court-circuit. Il permet d’optimiser l’exécution du code en ne perdant pas de temps sur des instructions qui seront forcément évaluées à false ou à true. Quand nous avancerons dans notre apprentissage du C++, nous verrons des cas où l’évaluation en court-circuit est bien utile.

II.5.9. Exercices

Allez, c’est l’heure de pratiquer un peu. C’est le meilleur moyen de progresser et de fixer toutes ces nouvelles notions dans votre mémoire. N’hésitez pas à faire cette section à tête reposée et avec le cours sous les yeux en même temps.

i

Un mot sur la licence

Certains exercices sont adaptés du cours sur le langage C , comme m’y autorisent la licence et mon statut de double auteur.

II.5.9.1. Une pseudo-horloge

Demandons à l’utilisateur de rentrer un nombre et nous lui afficherons la période de la journée correspondante: nuit, matin, après-midi, soir. Ainsi, entre 8h et 12h, nous sommes le matin.

Mais attention, nous voulons aussi gérer les cas un peu spéciaux que sont midi, minuit et un nombre qui n’est pas entre 0 et 24.

Correction pseudo-horloge

II.5.9.2. Score

Imaginez que vous avez un score de jeu vidéo sous la main.

— Si le score est strictement inférieur à deux mille, affichez «C’est la catastrophe!»

— Si le score est supérieur ou égal à deux mille et que le score est strictement inférieur à cinq mille, affichez: «Tu peux mieux faire!»

— Si le score est supérieur ou égal à cinq mille et que le score est strictement inférieur à neuf mille, affichez: «Tu es sur la bonne voie!»

— Sinon, affichez: «Tu es le meilleur!»

Correction score

II.5.9.3. XOR — Le OU exclusif

Le OR que nous avons vu plus tôt dans ce chapitre est dit «inclusif». Ainsi,a || b signifie a, ou b, ou les deux. Le but de cet exercice va être de faire un OU dit «exclusif», c’est-à-dire que si aet b renvoient la même chose, l’expression est évaluée à false, sinon àtrue. Vous pouvez le faire avec les opérateurs que nous avons vus.

Indice

Correction XOR

II.5.9.4. En résumé

— Nous pouvons tester une expression avecif. Si celle-ci est fausse, on peut tester d’autres expressions avec autant de else if qu’on veut. Enfin, else permet de tester le cas général, «tout le reste».

— Nous pouvons comparer des expressions entre elles avec les opérateurs de comparaisons.

— Les opérateurs logiques permettent de tester plusieurs expressions en même temps ou d’en obtenir la négation.

— Le compilateur optimise l’évaluation de ces multiples expressions grâce à l’évaluation en court-circuit.

Dans le document La programmation en C++ moderne (Page 75-79)