Progr. I MT & EL Progr. I MT & EL Le type Booléen Expressions logiques Delannoy chap3 (partiel) Le type booléen ne peut prendre que l’une des 2 valeurs logiques opposées suivantes: VRAI ou FAUX Objectifs: • maîtriser le type booléen en C • exploiter les opérateurs logiques • les combiner avec les autres opérateurs Le type booléen est essentiel pour construire les instructions de contrôle car elles reposent toutes sur l’évaluation d’une condition de ce type. Plan: Exemple: ‐ le type booléen (VRAI / FAUX) ‐ construire des expressions booléennes ‐ les combiner avec ET et OU Si la condition est VRAI Sinon ( la condition est FAUSSE) S4 3b 1/12 Progr. I MT & EL alors faire l’action1 alors faire l’action2 Chap03.2 S4 3b 2/12 Progr. I MT & EL Le type Booléen (1) Le type Booléen (2) C standard 89: C standard 99: Pas de type de base booléen, la valeur d’une condition prend l’une des 2 valeurs entières : - On dispose d’un nouveau type de base _Bool 0 si elle est FAUSSE 1 si elle est VRAI - Ou alors si on ajoute la directive #include <stdbool.h> Réciproquement: la valeur d'une expression utilisée pour exprimer une condition est convertie en un booléen: • motif binaire nul : FAUX • motif binaire non-nul : VRAI - On peut continuer à travailler comme précédemment on peut utiliser les mots clef: bool, true, false (ex: 0) (ex: n'importe quel entier différent de 0) la représentation binaire sera explorée en détails, en semaine 6 S4 3b 3/12 S4 3b 4/12 Progr. I MT & EL Progr. I MT & EL niveaux de priorités des opérateurs Les opérateurs relationnels comparaison < égalité différence != == <= > >= Pour construire des expressions booléennes dont la valeur est VRAI ou FAUX 45 opérateurs 15 niveaux de priorités Delannoy p 48 int a=77; int b=88; Associativité: pour les opérateurs de même priorité a<b valeur : VRAI conversion automatique en : Gauche‐>Droite / Left‐to‐Right Droite‐>Gauche / Right‐to‐Left int a == b ou FAUX 0 1 Que se passe t‐il si on utilise l'affectation au lieu de l'opérateur d'égalité ? if( a = 21) ... S4 3b 6/12 source: Tep Dobry http://ee.hawaii.edu/~tep/ Progr. I MT & EL Progr. I MT & EL Les opérateurs logiques int a=77; int b=88; • L’opérateur de négation logique, noté !, donne le booléen opposé de son opérande. printf("%d", (a < b)!=(a == b) ); • Sa table de vérité montre tous les cas possibles: x = 3*(a != b); char c1=‘C’; char c2 =‘H’; if(c1 < c2) … !FAUX donne VRAI !0 donne 1 !VRAI donne FAUX !1 donne 0 • Donner la valeur des expressions suivantes: • !(-1) • !(6%2) (cet usage sera justifié en semaine 6) S4 3b 7/12 S4 3b 8 /12 Progr. I MT & EL Progr. I MT & EL Le ET logique bool a, b; Le OU logique b bool a, b; a&&b 0 1 0 0 0 0 && b = 0 1 0 1 1 && b = b a ET b a¦¦b 0 1 0 0 1 0¦¦b = b 1 1 1 1¦¦b = 1 a LOGIQUE OU LOGIQUE Evaluation paresseuse du ET logique: Evaluation paresseuse du OU logique: L’opérande droit n'est PAS évalué si celui de gauche vaut 0 L’opérande droit n'est PAS évalué si celui de gauche vaut 1 Ex: donner l'expression qui est vraie quand l'entier k est compris entre 10 et 20 (bornes exclues): Ex: donner l'expression qui est vraie quand l'entier k est strictement à l'extérieur de l'intervalle [10, 20] : S4 3b 9/12 Progr. I MT & EL S4 3b 10/12 Progr. I MT & EL autre exemple Résumé #define MAX 10 ... int tab[MAX]; ... if( i< MAX && tab[i] != 0) tab[i]++ ; • Le type booléen n’existe pas en C standard 89, on travaille le type entier à la place • les valeurs booleennes FAUX / VRAI sont traitées comme les entiers 0 / 1 . • Réciproquement les opérateurs logiques convertissent les valeurs de leur opérandes en FAUX (si égal à 0) ou en VRAI (si ≠ 0) Loi de De Morgan • Le C standard 99 offre le type bool (include <stdbool.h> ) Soit P1 et P2 deux opérandes de valeur VRAI ou FAUX: • Le C exploite les propriétés des opérateurs logiques pour faire moins de calcul (évaluation paresseuse) !(P1 && P2) == !P1 || !P2 !(P1 || P2) == !P1 && !P2 • Il faut maitriser les lois de De Morgan pour construire des conditions complexes avec les opérateurs logiques Ex: donner LA NEGATION de l'expression qui est vraie quand l'entier k est compris entre 10 et 20 (bornes exclues): S4 3b 11/12 S4 3b 12/12