Progr. I MT & EL Expressions logiques Delannoy chap3 (partiel) Objectifs: • maîtriser le type booléen en C • exploiter les opérateurs logiques • les combiner avec les autres opérateurs Plan: - le type booléen (VRAI / FAUX) - construire des expressions booléennes - les combiner avec ET et OU S4 3b 1/12 Progr. I MT & EL Le type Booléen Le type booléen ne peut prendre que l’une des 2 valeurs logiques opposées suivantes: VRAI ou FAUX 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. Exemple: Si la condition est VRAI Sinon ( la condition est FAUSSE) Chap03.2 alors faire l’action1 alors faire l’action2 S4 3b 2/12 Progr. I MT & EL Le type Booléen (1) C standard 89: Pas de type de base booléen, la valeur d’une condition prend l’une des 2 valeurs entières : 0 si elle est FAUSSE 1 si elle est VRAI Réciproquement: la valeur d'une expression utilisée pour exprimer une condition est convertie en un booléen: : FAUX • motif binaire nul • motif binaire non-nul : VRAI (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 Progr. I MT & EL Le type Booléen (2) C standard 99: - On peut continuer à travailler comme précédemment - On dispose d’un nouveau type de base _Bool - Ou alors si on ajoute la directive #include <stdbool.h> on peut utiliser les mots clef: bool, true, false S4 3b 4/12 Progr. I MT & EL niveaux de priorités des opérateurs 45 opérateurs 15 niveaux de priorités Delannoy p 48 Associativité: pour les opérateurs de même priorité Gauche->Droite / Left-to-Right Droite->Gauche / Right-to-Left source: Tep Dobry http://ee.hawaii.edu/~tep/ Progr. I MT & EL Les opérateurs relationnels comparaison < égalité différence != == <= > >= Pour construire des expressions booléennes dont la valeur est VRAI ou FAUX int a=77; int b=88; a<b valeur : VRAI conversion automatique en : int 1 a == b ou FAUX 0 printf("%d\n", (a < b)!=(a == b) ); 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 Progr. I MT & EL • Opérateur conditionnel: priorité décroissante opérande1 ? opérande2 : opérande3 Si opérande1 est VRAI Alors la valeur de l’expression est opérande2 Sinon la valeur de l’expression est opérande3 int max, a, b ; … max = (a > b) ? a : b ; Chap03.7 S4 3b 7/12 Progr. I MT & EL Les opérateurs logiques • L’opérateur de négation logique, noté !, donne le booléen opposé de son opérande. • Sa table de vérité montre tous les cas possibles: !FAUX donne VRAI !0 donne 1 !VRAI donne FAUX !1 donne 0 • Donner la valeur des expressions suivantes: • !(-1) • !(6%2) S4 3b 8 /12 Progr. I MT & EL Le ET logique bool a, b; b a&&b 0 1 0 0 0 0 && b = 0 1 0 1 1 && b = b a ET LOGIQUE Evaluation paresseuse du ET logique: L’opérande droit n'est PAS évalué si celui de gauche vaut 0 Ex: donner l'expression qui est vraie quand l'entier k est compris entre 10 et 20 (bornes exclues): S4 3b 9/12 Progr. I MT & EL Le OU logique bool a, b; b a¦¦b 0 1 0 0 1 0¦¦b = b 1 1 1 1¦¦b = 1 a OU LOGIQUE Evaluation paresseuse du OU logique: 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 strictement à l'extérieur de l'intervalle [10, 20] : S4 3b 10/12 Progr. I MT & EL autre exemple #define MAX 10 ... int tab[MAX]; ... if( i< MAX && tab[i] != 0) tab[i]++ ; Loi de De Morgan Soit P1 et P2 deux opérandes de valeur VRAI ou FAUX: !(P1 && P2) == !P1 || !P2 !(P1 || P2) == !P1 && !P2 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 Progr. I MT & EL Résumé • 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) • Le C standard 99 offre le type bool (include <stdbool.h> ) • Le C exploite les propriétés des opérateurs logiques pour faire moins de calcul (évaluation paresseuse) • Il faut maitriser les lois de De Morgan pour construire des conditions complexes avec les opérateurs logiques S4 3b 12/12