![]()
Sémantique des expressions ![]()
![]()
![]()
![]()
![]()
Suivant: Récréation Début: Les expressions Précédent: Opérateur conversion
Paragraphes
Sémantique des expressions
Opérateurs d'adressage
Dans le langage C, les constructions suivantes :
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
()
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 *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 sia == b == c
signifie(a == b) == c
ou si elle signifiea == (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é.
- postfixé
- postfixé
- préfixé
- préfixé
- unaire
- unaire
- indirection
- adresse de
- multiplication
- et bit bit
Discussion
Les choix fait pour les priorités des opérateurs sont assez mauvais, les concepteurs du langage eux-mêmes en conviennent.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.
![]()
![]()
![]()
![]()
![]()
Suivant: Récréation Début: Les expressions Précédent: Opérateur conversion
30/9/1997