Changements de type

Il arrive qu’une variable d’un certain type doive être recopiée dans une autre, d’un type différent. Le compilateur doit alors effectuer un changement de type (type casting). Ce changement est automatique dans certains cas, notamment pour les passages des entiers entre eux ou des décimaux aux entiers et réciproquement.

Dans d’autres cas, la transformation n’est pas automatique, il faut l’expliciter avec un opérateur de changement de type, sans quoi le compilateur proteste. Un tel opérateur a une syntaxe très simple : pour transformer une variable ou une expression d’un type quelconque en un type différent xxx, on écrit :

(xxx) expression

ou encore :

xxx (expression)

comme si xxx était une fonction.

Voici un exemple simple. Si l’on écrit :

int i = 100, j = 3;double d = i/j;

d vaudra alors 33.0, parce que la division est effectuée sur des opérateurs entiers et que le reste est donc perdu. Par contre, si l’on écrit l’une quelconque des deux lignes suivantes :

double d = i/ (double) j;

ou bien :

double d = i/ double(j);

d sera initialisé à 33.333..., comme attendu, car j aura été transformé en décimal avant la division; dans ce cas, i est aussi transformé implicitement en décimal pour faire la division, suivant les règles de conversion résultant des opérations. (On aurait pu aussi faire le changement de type sur i.)

Le changement de type est réellement considéré comme un opérateur unaire par le compilateur (des opérateurs unaires en fait, car il en existe autant que de types), et il peut être redéfini comme les autres (voir le chapitre 7). Il a une priorité plus élevée que les opérateurs binaires.

Exercice 2.8

Parmi les lignes suivantes, lesquelles donnent à d la valeur 33.333... ?

d = double(i)/j;d = (double) i/j;d = double(i/j);d = double(i)/ double(j);
Voir solution

Le changement de type est couramment utilisé pour modifier les types de pointeurs (voir paragraphe à ce sujet).

Précédent Précédent Sommaire Sommaire Suivant Suivant