Next: Récréation
Up: Les expressions
Previous: Opérateur conversion
Sous-sections
Dans le langage C, les constructions suivantes :
() |
pour l'appel de procédure |
[] |
pour l'indexation |
* |
pour l'indirection |
. |
pour la sélection de champ |
-> |
pour l'indirection et sélection |
& |
pour délivrer l'adresse d'un objet |
sont des opérateurs à part entière.
Cela signifie que ces opérateurs, que l'on peut appeler opérateurs
d'adressage, ont une priorité et sont en
concurrence avec les autres opérateurs pour déterminer la sémantique
d'une expression.
Par exemple, la sémantique de l'expression
*p++
ne peut se déterminer
que si l'on connaît les priorités relatives des opérateurs
*
et
++
.
Pour déterminer la sémantique d'une expression il faut non seulement
connaître la priorité
des opérateurs mais également leur associativité.
En effet, seule la connaissance de l'associativité de l'opérateur
==
permet de savoir si
a == b == c
signifie
(a == b) == c
ou si elle signifie
a == (b == c)
.
Un opérateur a une associativité à droite quand :
a op b op c
signifie a op ( b op c).
Un opérateur a une associativité à gauche quand :
a op b op c
signifie (a op b) op c.
Nous donnons ci-dessous le tableau exhaustif des opérateurs avec leurs
priorités et leurs associativité.
priorité |
Opérateur |
Associativité |
16 |
() []
->
.
++ 1
-- 2 |
G |
15 |
! ~
++ 3
-- 4
- 5
+ 6
* 7
& 8
sizeof |
D |
14 |
conversion |
D |
13 |
* 9 / % |
G |
12 |
+ - |
G |
11 |
<< >> |
G |
10 |
< <= > >= |
G |
9 |
== != |
G |
8 |
& 10 |
G |
7 |
^ |
G |
6 |
| |
G |
5 |
&& |
G |
4 |
|| |
G |
3 |
?: |
D |
2 |
= += -= *= /= %= >>= <<= &= ^= |= |
D |
1 |
, |
G
|
- 1 postfixé
- 2 postfixé
- 3 préfixé
- 4 préfixé
- 5 unaire
- 6 unaire
- 7 indirection
- 8 adresse de
- 9 multiplication
- 10 et bit bit
Les choix faits pour les priorités des opérateurs sont assez mauvais,
les concepteurs du langage eux-mêmes en conviennent.
7.1
Les choix les plus irritants sont les suivants :
- -
- La précédence des opérateurs bits à bits est plus petite que celle
des opérateurs de comparaison. Donc a&b == c ne signifie
pas (a&b) == c, mais a & (b==c).
- -
- La précédence des opérateurs de décalage est plus petite que celle
des opérateurs de + et -. Donc a << 4 + b signifie
a << (4 + b).
Il est considéré comme un bon style de programmation en C, de systématiquement
parenthéser les expressions dès qu'elles comportent d'autres opérateurs
que les opérateurs de l'arithmétique usuelle.
À part quelques exceptions,
l'ordre d'évaluation des opérandes d'un opérateur n'est pas
spécifié par le langage.
Ceci a pour conséquence que le programmeur doit faire extrêmement attention
aux effets de bords dans les expressions.
Par exemple, l'instruction :
t[i] = f();
où la fonction
f modifie la valeur de
i a un comportement
indéterminé : il est impossible de savoir si la valeur prise
pour indexer
t sera celle de
i avant ou après l'appel à
f.
Next: Récréation
Up: Les expressions
Previous: Opérateur conversion
Bernard Cassagne
1998-12-09