Priorité et associativité des opérateurs
Le
Greydavayar
Bonjour a tous,
je lis partout le terme "d'associativité" des opérateurs ainsi que le
teme de "priorité" des opérateurs je pense avoir compris celui de la
priorité mais cette notion d'associativité reste très (trop) floue
pour moi et je ne trouve rien qui l'explique clairement sur le net.
Bonne soirée
je lis partout le terme "d'associativité" des opérateurs ainsi que le
teme de "priorité" des opérateurs je pense avoir compris celui de la
priorité mais cette notion d'associativité reste très (trop) floue
pour moi et je ne trouve rien qui l'explique clairement sur le net.
Bonne soirée

Poser une question


La notion d'associativité mathématique est un concept élémentaire des
mathématiques dont les définitions ne manquent pas sur Internet.
Une simple recherche Google vous orientera vers ceci :
http://www.netmaths.net/lexique/Def...ité
http://fr.wikipedia.org/wiki/Associativité
Qui me semble largement accessible.
Bonne nuit.
On 2010-09-04 23:25:11 +0200, Greydavayar said:
Je pense qu'il y a au moins un bon exemple classique ici, à partir de
l'opérateur == :
Note: à la place de G on trouve plus souvent LR (Left to Right) et RL à
la place de D.
Pour illustrer le fait que * (multiplication) a une priorité (ou
précédence) 13 supérieure à celle de + (addition) 12, il vous suffit de
faire:
printf("%dn", 12 + 2 * 4);
qui affichera 20, comme:
printf("%dn", 12 + (2 * 4));
et non 56 comme le ferait:
printf("%dn", (12 + 2) * 4);
Personnellement, je mets toutes les parenthèses nécessaire pour que le
code soit limpide, sur du code neuf ou si je peux corriger. En effet,
et c'est signalé dans l'article en lien, les priorités ne correspondent
pas aux intuitions les plus courantes, en tout cas pour ceux qui ne
font pas que du C.
--
Pierre Maurette
Ben la priorité des opérateurs c'est la règle qui gère l'ordre dans lequel
des opérateurs différents seront évalués. Par exemple a + b * c signifie
a+(b*c).
L'associativité est utilisée pour savoir dans quel ordre il faut évaluer des
opérateurs identiques. Par exemple, en C l'addition est un opérateur
binaire, donc quand on écrit a + b + c il faut que le compilo ait une règle
pour savoir s'il doit calculer (a+b) + c ou a+(b+c). Souvent le résultat de
ces deux évaluations est identique, et mais, par exemple lorsque que la
magnitude d'un des deux opérande est vraiment très différente de celle des
deux autre, cet ordre peut avoir une influence sur l'arrondi et donc le
résultat.
Petit quizz : comment sont évaluées :
a - b - c ?
a / b / c ?
P.S: à mon avis, un programmeur écrivant des expressions comme ci-dessus
mérite un magistral coup de pied au cul !
--- news://freenews.netfront.net/ - complaints: ---
A mon avis, quelqu'un qui ne sait pas lire les expressions ci-dessus et
qui se proclame "programmeur" merite un petit retour sur ses bancs d'ecole,
section arithmetique elementaire...
Et ceci, ce n'est pas clair :
http://c.developpez.com/cours/berna...ode101.php ?
Exemples pour l'associativité :
- Associativité à gauche de l'opérateur + binaire :
a + b + c + d s'interprète comme :
(((a + b) + c ) + d)
- Associativité à droite de l'opérateur d'affectation :
a = b = c = d s'interprète comme :
(a = (b = (c = d)))
c est affecté par d. Puis le résultat est affecté à b, puis le résultat
de cette nouvelle affectation est affecté à a. Je parle de résultat car
il peut y avoir des conversions à chaque étape si les variables ne sont
pas de même type.
Il est conseillé de TOUJOURS mettre les parenthèses dans les expressions.
Priorité des opérateurs :
- La multiplication est prioritaire par rapport à l'addition. Ceci
signifie que :
a + b * c s'interprète comme :
a + (b * c)
- attention à certains cas : l'opérateur & (opérateur ET bit à bit) est
plus prioritaire que les opérations arithmétiques
a + b & c s'interprète comme
a + (b & c)
En général, ce que souhaite le programmeur, c'est plutôt faire :
(a + b) & c (appliquer un "masque" au résultat de l'addition).
J'ai vu je ne sais combien de fois cette erreur en faisant des revues de
code (et pas seulement en C, C++ ou Java mais aussi en PL/1, par exemple).