Les opérateurs arithmétiques sont
+
, -
, *
, /
et %
. L'opération réalisée
n'est pas la même selon que ses arguments (on dit aussi
opérandes ) sont entiers ou flottants ; c'est notamment le cas
pour la division : 5/2 a pour valeur 2 tandis que
5.0/2.0 a pour valeur 2.5. Pour effectuer l'opération
flottante quand les arguments sont entiers, il faut d'abord appliquer
une coercition (double) à l'un des opérandes :
(double)5/2 a ainsi pour valeur 2.5 et (double)5 a
pour valeur le flottant 5.0.
L'opération modulo , %, n'est quant à elle définie que pour les entiers : 5%2 a pour valeur 1.
L'analyse syntaxique d'une expression est déterminée par des règles de précédence, dont on ne peut s'affranchir (et donc les ignorer) que si les expressions sont complètement parenthésées. On préfère cependant écrire 2*x/3 - 5*y plutôt que ((2*x)/3) - (5*y), conformément à un usage courant ; mais 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 valeur. Le tableau complet des précédences des opérateurs est donné en annexe. En voici un extrait, limité à quelques opérateurs arithmétiques :
Opérateurs | Associativité |
+ - (type) | droite à gauche |
---|---|
* / % | gauche à droite |
+ - | gauche à droite |
Les opérateurs d'une même ligne sont analysés par associativité comme indiqué sur le tableau. Ainsi, -(double)5 est analysé comme -((double)5), x/2*3 comme (x/2)*3, et x-y-z comme (x-y)-z.
Quand les arguments d'une opération ne sont pas de même type (par exemple un int et un float), il y a conversion implicite de l'un d'eux dans le type de l'autre ; par exemple, int + float est converti en float + float. Cette conversion implicite se fait toujours dans la direction du << plus grand >> type : de int vers float, de float vers double.