Sem4 Chap3b (1ppf) - EPFL moodle service

publicité
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
Téléchargement