© Éditions Eyrolles
43
chapitre n° 3
Les opérateurs et les expressions en langage C
entraînera tout d’abord l’évaluation de l’expression située à droite, ce qui fournira une valeur
de type float ; cette dernière sera ensuite convertie en int pour pouvoir être affectée à n.
D’une manière générale, lors d’une affectation, toutes les conversions (d’un type numérique
vers un autre type numérique) sont acceptées par le compilateur mais le résultat en est plus ou
moins satisfaisant. En effet, si aucun problème ne se pose (autre qu’une éventuelle perte de
précision) dans le cas de conversion ayant lieu suivant le bon sens de la hiérarchie des types, il
n’en va plus de même dans les autres cas.
Par exemple, la conversion float -> int (telle que celle qui est mise en jeu dans l’instruction précédente) ne fournira un résultat acceptable que si la partie entière de la valeur flottante
est représentable dans le type int. Si une telle condition n’est pas réalisée, non seulement
le résultat obtenu pourra être différent d’un environnement à un autre mais, de surcroît, on
pourra aboutir, dans certains cas, à une erreur d’exécution.
De la même manière, la conversion d’un int en char sera satisfaisante si la valeur de l’entier
correspond à un code d’un caractère.
Sachez, toutefois, que les conversions d’un type entier vers un autre type entier ne conduisent,
au pis, qu’à une valeur inattendue mais jamais à une erreur d’exécution.
10 L’opérateur de cast
S’il le souhaite, le programmeur peut forcer la conversion d’une expression quelconque dans
un type de son choix, à l’aide d’un opérateur un peu particulier nommé en anglais « cast ».
Si, par exemple, n et p sont des variables entières, l’expression :
(double) ( n/p )
aura comme valeur celle de l’expression entière n/p convertie en double.
La notation (double) correspond en fait à un opérateur unaire dont le rôle est d’effectuer la
conversion dans le type double de l’expression sur laquelle il porte. Notez bien que cet
opérateur force la conversion du résultat de l’expression et non celle des différentes valeurs
qui concourent à son évaluation. Autrement dit, ici, il y a d’abord calcul, dans le type int,
du quotient de n par p ; c’est seulement ensuite que le résultat sera converti en double. Si n
vaut 10 et que p vaut 3, cette expression aura comme valeur 3.
D’une manière générale, il existe autant d’opérateurs de « cast » que de types différents (y
compris les types dérivés comme les pointeurs que nous rencontrerons ultérieurement). Leur
priorité élevée (voir tableau en fin de chapitre) fait qu’il est généralement nécessaire de placer
entre parenthèses l’expression concernée. Ainsi, l’expression :
(double) n/p
Delannoy Livre.book Page 43 Mercredi, 6. mai 2009 4:26 16
43
chapitre n° 3
Les opérateurs et les expressions en langage C
entraînera tout d’abord l’évaluation de l’expression située à droite, ce qui fournira une valeur
de type float ; cette dernière sera ensuite convertie en int pour pouvoir être affectée à n.
D’une manière générale, lors d’une affectation, toutes les conversions (d’un type numérique
vers un autre type numérique) sont acceptées par le compilateur mais le résultat en est plus ou
moins satisfaisant. En effet, si aucun problème ne se pose (autre qu’une éventuelle perte de
précision) dans le cas de conversion ayant lieu suivant le bon sens de la hiérarchie des types, il
n’en va plus de même dans les autres cas.
Par exemple, la conversion float -> int (telle que celle qui est mise en jeu dans l’instruction précédente) ne fournira un résultat acceptable que si la partie entière de la valeur flottante
est représentable dans le type int. Si une telle condition n’est pas réalisée, non seulement
le résultat obtenu pourra être différent d’un environnement à un autre mais, de surcroît, on
pourra aboutir, dans certains cas, à une erreur d’exécution.
De la même manière, la conversion d’un int en char sera satisfaisante si la valeur de l’entier
correspond à un code d’un caractère.
Sachez, toutefois, que les conversions d’un type entier vers un autre type entier ne conduisent,
au pis, qu’à une valeur inattendue mais jamais à une erreur d’exécution.
10 L’opérateur de cast
S’il le souhaite, le programmeur peut forcer la conversion d’une expression quelconque dans
un type de son choix, à l’aide d’un opérateur un peu particulier nommé en anglais « cast ».
Si, par exemple, n et p sont des variables entières, l’expression :
(double) ( n/p )
aura comme valeur celle de l’expression entière n/p convertie en double.
La notation (double) correspond en fait à un opérateur unaire dont le rôle est d’effectuer la
conversion dans le type double de l’expression sur laquelle il porte. Notez bien que cet
opérateur force la conversion du résultat de l’expression et non celle des différentes valeurs
qui concourent à son évaluation. Autrement dit, ici, il y a d’abord calcul, dans le type int,
du quotient de n par p ; c’est seulement ensuite que le résultat sera converti en double. Si n
vaut 10 et que p vaut 3, cette expression aura comme valeur 3.
D’une manière générale, il existe autant d’opérateurs de « cast » que de types différents (y
compris les types dérivés comme les pointeurs que nous rencontrerons ultérieurement). Leur
priorité élevée (voir tableau en fin de chapitre) fait qu’il est généralement nécessaire de placer
entre parenthèses l’expression concernée. Ainsi, l’expression :
(double) n/p
Delannoy Livre.book Page 43 Mercredi, 6. mai 2009 4:26 16
