La valeur d'une expression dépend des valeurs des sous-expressions et de l'opérateur qui les combine. Les sous-expressions d'une expression sont toujours évaluées de gauche à droite. Cette section va passer en revue les différentes catégories d'opérateurs.
Java 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 : en particulier, 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 : <
, <=
, >
,
>=
, ==
(égalité), !=
(non-égalité). La valeur
d'une expression relationnelle est un booléen : par exemple, 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 » ||
. Par exemple,
le « ou exclusif » peut être défini ainsi à l'aide de ces opérateurs :
static boolean xor(boolean p, boolean q) { return p && !q || !p && q; }
L'analyse syntaxique d'une expression est précisée par des règles de précédence, que l'on ne peut ignorer que si les expressions sont complètement parenthésées, ce qui est une contrainte souvent excessive : sans ces règles, l'expression logique
p && !q || !p && q
(p && (!q))|| ((!p) && q)
.
&&
et enfin ||
.
&&
||
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 :
l'évaluation de
?
:
commence par évaluer
; si sa
valeur est vraie, alors
est évalué, sinon
est évalué. Par
exemple, la fonction valeur absolue peut être définie ainsi :
static double abs(double x) { return x >= 0 ? x : -x; }
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.
Ces expressions sont formées à partir des opérateurs arithmétiques :
les opérateurs additifs +
,
-
, les opérateurs
multiplicatifs *
, /
et %
(modulo) et les opérateurs unaires +
et -.
Conformément à l'usage courant, on préfère écrire l'expression
2*x/3 - 5*y plutôt que ((2*x)/3) - (5*y) ; sans règle
de précédence, l'expression non parenthésée pourrait tout aussi bien
être analysée comme (2*x)/((3-5)*y), qui n'a sûrement pas la
même signification. En termes de précédence, les opérateurs unaires
(+, -) sont les plus forts, puis viennent les
multiplicatifs (*, /, %) et les additifs
(+, -). Par exemple, -1+3 est analysée comme
(-1) + 3, et 2*x+3*y comme (2*x) + (3*y). Les
opérateurs binaires sont parenthésés par la gauche (en anglais,
left associative) ; par exemple, x/2*3 est analysée
comme (x/2)*3, et x-y-z comme (x-y)-z (s'ils
étaient parenthésés par la droite, ces expressions seraient analysées
respectivement comme x/(2*3) et comme x-(y-z)). Les
opérateurs unaires sont parenthésés par la droite : par exemple,
--x
est analysée comme -(-x) et non comme
(--)x
.
Un extrait du tableau des précédences pour les opérateurs arithmétiques, logiques, conditionnels, par ordre de précédence décroissante figure sur le tableau suivant. 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 // analysée en ((x+y)>z) || ((x<0) && (y<0))
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 |