next up previous contents index
suivant: Instruction conditionnelle if monter: main précédent: Opérateurs et expressions arithmétiques   Table des matières   Index


Booléens et expressions logiques

C++, comme beaucoup d'autres langages, mais contrairement à C, dispose d'un type booléen, bool, dont les valeurs sont true et false5. Les constantes de type booléen sont true et false. Pour des raisons historiques, les booléens peuvent être convertis en entier et réciproquement, selon la règle suivante : true est converti en 1, tout entier non nul est converti en true, false est converti en 0, et 0 est converti en false.


Les expressions logiques sont formées à partir des expressions relationnelles à l'aide des opérateurs logiques.

Les opérateurs relationnels sont : <, <=, >, >=, ==, !=6. Ces opérateurs retournent un booléen : la valeur de 1 == 2 est false (faux), celle de 2 == 2 est true (vrai).

Les opérateurs logiques sont la négation !, le << et >> && et le << ou >> ||. Les deux derniers ont la particularité d'être séquentiels, c'est-à-dire de donner lieu à une évaluation de gauche à droite :

Ce comportement des opérateurs && et || est différent de celui des and et or de Pascal qui évaluent toujours leurs deux arguments. Il permet d'écrire des tests de la forme :


  if (x != 0 && 1/x < epsilon) { ... }
  if (i > N || t[i] > A) { ... }          // t de taille N

Une autre expression dont l'évaluation est séquentielle est l'expression conditionnelle, présente également en CAML et en Java, mais pas pas en Pascal ou en Fortran : l'évaluation de $A$ ? $B$ : $C$ commence par évaluer $A$ ; si sa valeur est vraie, alors $B$ est évalué, sinon $C$ est évalué. Par exemple, l'expression


  x >= 0 ? x : -x

a pour valeur la valeur absolue de la valeur de x.

Par contre, il est important de savoir que l'ordre d'évaluation des autres expressions de C++ ainsi que des arguments dans les appels de fonction n'est pas déterminé. Il est donc erroné de supposer en général un ordre d'évaluation, par exemple de gauche à droite.

Voici un extrait du tableau des précédences pour les opérateurs arithmétiques, logiques, conditionnels :

Opérateurs Associativité
! + $_{\mathsf{un}}$ - $_{\mathsf{un}}$ droite à gauche
* / % gauche à droite
+ - gauche à droite
< < = = gauche à droite
== != gauche à droite
&& gauche à droite
|| gauche à droite
? : droite à gauche
On retiendra l'ordre : opérateurs arithmétiques, opérateurs de comparaison, opérateurs logiques, qui permet d'écrire sans parenthèse l'expression logique


  x+y>z || x<0 && y<0

qui est analysée en :


  ((x+y)>z) || ((x<0) && (y<0))

L'opérateur conditionnel ayant la plus faible précédence, il n'est pas nécessaire de placer ses trois sous-expressions entre parenthèses. Il suffira d'écrire


  n<=1 ? 1 : fib(n-1) + fib(n-2)

au lieu de


  (n<=1) ? 1 : (fib(n-1) + fib(n-2))


next up previous contents index
suivant: Instruction conditionnelle if monter: main précédent: Opérateurs et expressions arithmétiques   Table des matières   Index
R Lalement