Programmer en langage C
28
© Éditions Eyrolles
Les opérateurs unaires + et - ont la priorité la plus élevée. On trouve ensuite, à un même
niveau, les opérateurs *, / et %. Enfin, sur un dernier niveau, apparaissent les opérateurs
binaires + et -.
En cas de priorités identiques, les calculs s’effectuent de gauche à droite. On dit que l’on a
affaire à une associativité de gauche à droite (nous verrons que quelques opérateurs, autres
qu’arithmétiques, utilisent une associativité de droite à gauche).
Enfin, des parenthèses permettent d’outrepasser ces règles de priorité, en forçant le calcul
préalable de l’expression qu’elles contiennent. Notez que ces parenthèses peuvent également
être employées pour assurer une meilleure lisibilité d’une expression.
Voici quelques exemples dans lesquels l’expression de droite, où ont été introduites des parenthèses superflues, montre dans quel ordre s’effectuent les calculs (les deux expressions proposées
conduisent donc aux mêmes résultats) :
a + b * c
a + ( b * c )
a * b + c % d
( a * b ) + ( c % d )
- c % d
( - c ) % d
- a + c % d
( - a ) + ( c % d )
- a / - b + c
( ( - a ) / ( - b ) ) + c
- a / - ( b + c )
( - a ) / ( - ( b + c ) )
Les règles de priorité interviennent pour définir la signification exacte d’une expression. Néanmoins, lorsque deux opérateurs sont théoriquement commutatifs, on ne peut être certain de
l’ordre dans lequel ils seront finalement exécutés. Par exemple, une expression telle que
a+b+c pourra aussi bien être calculée en ajoutant c à la somme de a et b, qu’en ajoutant a à
la somme de b et c. Même l’emploi de parenthèses dans ce cas ne suffit pas à « forcer »
l’ordre des calculs. Notez bien qu’une telle remarque n’a d’importance que lorsque l’on cherche à
maîtriser parfaitement les erreurs de calcul.
Il est tout à fait possible qu'une opération portant sur deux valeurs entières conduise à un
résultat non représentable dans le type concerné, parce que en dehors des limites permises,
lesquelles, rappelons-le, dépendent de la machine employée. Dans ce cas, la plupart du
temps, on obtient un résultat aberrant : les bits excédentaires sont ignorés, le résultat est analogue à celui obtenu lorsque la somme de deux nombres à 3 chiffres est un nombre à quatre
chiffres dont on élimine le chiffre de gauche ; l'exécution du programme se poursuit sans que
l'utilisateur ait été informé d'une quelconque anomalie. Notez bien à ce propos qu’un opérateur
appliqué par exemple à deux opérandes de type int fournit toujours un résultat de type int,
même s’il n’est plus représentable dans ce type et qu’un type long aurait pu convenir.
De la même manière, il se peut qu'à un moment donné vous cherchiez à diviser un entier par
zéro. Cette fois, la plupart du temps, cette anomalie est effectivement détectée : un message
d'erreur est fourni à l'utilisateur, et l'exécution du programme est interrompue.
Comme les opérations entières, les opérations sur les flottants peuvent conduire à des résultats
non représentables dans le type concerné (de valeur absolue trop grande ou trop petite). Dans
ce cas, le comportement dépend des environnements de programmation utilisés ; en particulier,
il peut y avoir arrêt de l'exécution du programme. Là encore, il faut bien noter qu’un opérateur
Delannoy Livre.book Page 28 Mercredi, 6. mai 2009 4:26 16
28
© Éditions Eyrolles
Les opérateurs unaires + et - ont la priorité la plus élevée. On trouve ensuite, à un même
niveau, les opérateurs *, / et %. Enfin, sur un dernier niveau, apparaissent les opérateurs
binaires + et -.
En cas de priorités identiques, les calculs s’effectuent de gauche à droite. On dit que l’on a
affaire à une associativité de gauche à droite (nous verrons que quelques opérateurs, autres
qu’arithmétiques, utilisent une associativité de droite à gauche).
Enfin, des parenthèses permettent d’outrepasser ces règles de priorité, en forçant le calcul
préalable de l’expression qu’elles contiennent. Notez que ces parenthèses peuvent également
être employées pour assurer une meilleure lisibilité d’une expression.
Voici quelques exemples dans lesquels l’expression de droite, où ont été introduites des parenthèses superflues, montre dans quel ordre s’effectuent les calculs (les deux expressions proposées
conduisent donc aux mêmes résultats) :
a + b * c
a + ( b * c )
a * b + c % d
( a * b ) + ( c % d )
- c % d
( - c ) % d
- a + c % d
( - a ) + ( c % d )
- a / - b + c
( ( - a ) / ( - b ) ) + c
- a / - ( b + c )
( - a ) / ( - ( b + c ) )
Les règles de priorité interviennent pour définir la signification exacte d’une expression. Néanmoins, lorsque deux opérateurs sont théoriquement commutatifs, on ne peut être certain de
l’ordre dans lequel ils seront finalement exécutés. Par exemple, une expression telle que
a+b+c pourra aussi bien être calculée en ajoutant c à la somme de a et b, qu’en ajoutant a à
la somme de b et c. Même l’emploi de parenthèses dans ce cas ne suffit pas à « forcer »
l’ordre des calculs. Notez bien qu’une telle remarque n’a d’importance que lorsque l’on cherche à
maîtriser parfaitement les erreurs de calcul.
Il est tout à fait possible qu'une opération portant sur deux valeurs entières conduise à un
résultat non représentable dans le type concerné, parce que en dehors des limites permises,
lesquelles, rappelons-le, dépendent de la machine employée. Dans ce cas, la plupart du
temps, on obtient un résultat aberrant : les bits excédentaires sont ignorés, le résultat est analogue à celui obtenu lorsque la somme de deux nombres à 3 chiffres est un nombre à quatre
chiffres dont on élimine le chiffre de gauche ; l'exécution du programme se poursuit sans que
l'utilisateur ait été informé d'une quelconque anomalie. Notez bien à ce propos qu’un opérateur
appliqué par exemple à deux opérandes de type int fournit toujours un résultat de type int,
même s’il n’est plus représentable dans ce type et qu’un type long aurait pu convenir.
De la même manière, il se peut qu'à un moment donné vous cherchiez à diviser un entier par
zéro. Cette fois, la plupart du temps, cette anomalie est effectivement détectée : un message
d'erreur est fourni à l'utilisateur, et l'exécution du programme est interrompue.
Comme les opérations entières, les opérations sur les flottants peuvent conduire à des résultats
non représentables dans le type concerné (de valeur absolue trop grande ou trop petite). Dans
ce cas, le comportement dépend des environnements de programmation utilisés ; en particulier,
il peut y avoir arrêt de l'exécution du programme. Là encore, il faut bien noter qu’un opérateur
Delannoy Livre.book Page 28 Mercredi, 6. mai 2009 4:26 16
