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 :
&&
est faux si est faux, et vrai si
et sont vrais : n'est pas évalué si est faux||
est vrai si est vrai, et faux si
et sont faux : n'est pas évalué si est vrai&&
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 ? : commence par évaluer ; si sa valeur est vraie, alors est évalué, sinon 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é |
! + - | droite à gauche |
* / % | gauche à droite |
+ - | gauche à droite |
< < = = | gauche à droite |
== != | gauche à droite |
&& | gauche à droite |
|| | gauche à droite |
? : | droite à gauche |
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))