IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
next up previous contents index
Next: Récréation Up: Les expressions Previous: Opérateur conversion

Sous-sections

Sémantique des expressions

Opérateurs d'adressage

  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 ++.

Priorité et associativité des opérateurs

    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


Discussion

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).

Recommandation

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.

Ordre d'évaluation des opérandes

  À 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 up previous contents index
Next: Récréation Up: Les expressions Previous: Opérateur conversion
Bernard Cassagne
1998-12-09