Remarque 2
Lors de l'évaluation d'une (sous)expression mélangeant plusieurs types, on
utilise le type le plus large. Exemple:
//=========================
int i=3,j=2,m;
double r=3.4;
m = (i/j)*r;
//=========================
Le mécanisme d'évaluation se fait de la manière suivante. D'abord
l'expression (i/j)
est évaluée: comme i
et j
sont
entiers, /
désigne la division entière, cela donne donc 1. Puis pour
évaluer le produit 1*r
, il faut convertir 1 en double
(1.0)
et faire le produit sur les doubles, cela donne 3.4, finalement on procède
à l'affectation: comme m
est entier, 3.4 est converti en
int
. Finalement on a m
=3.
Une précision : l'évaluation d'une expression ne se fait pas
toujours de gauche à droite, par exemple, l'évaluation de
(i/j)*(r/3)
pourrait commencer par celle de (i/j)
puis
(r/3)
ou l'inverse. Ici ca ne change pas le résultat !
Afin d'éviter des erreurs dues à ce genre de mécanisme de conversion
automatique, il est possible de convertir explicitement des données d'un
certain type en un autre. Par exemple, dans l'exemple ci-dessus, si on
voulait obtenir la division réelle dans (i/j) au lieu de la
division entière, il aurait fallu convertir un des deux arguments en
double. Cela peut se faire avec double(i)
L'expression devient alors: (double(i)/j) et retourne 1.5.