Java, comme beaucoup d'autres langages, mais contrairement à C, dispose d'un type booléen, boolean, dont les valeurs sont true et false. Ce type n'est un sous-type ou sur-type d'aucun autre type primitif : on ne peut pas convertir un entier en booléen ni un booléen en entier.
Les expressions logiques sont formées à partir des expressions relationnelles à l'aide des opérateurs logiques.
Les opérateurs relationnels sont : <
, <=
, >
,
>=
, ==
, !=
. 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 :
&&
B est faux si A est faux, et vrai si
A et B sont vrais : B n'est pas évalué si A est faux
||
B est vrai si A est vrai, et faux si
A et B sont faux : B n'est pas évalué si A 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, en C et en C++, mais 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.
Voici un extrait du tableau des précédences pour les opérateurs arithmétiques, logiques, conditionnels :
opérateurs | parenthésés |
! + - | par la droite |
* / % | par la gauche |
+ - | par la gauche |
< < = = | par la gauche |
== != | par la gauche |
&& | par la gauche |
|| | par la gauche |
? : | par la droite |
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))
Signalons qu'au type primitif boolean est associée une classe enveloppante Boolean .