priorité des opérateurs et associativité ne vous dit pas ce qui se passe avant et ce qui se passe après. La précédence/l'associativité de l'opérateur n'a rien à voir avec cela. Dans le langage C, les relations temporelles comme "avant" ou "après" sont définies par des points de séquence et seulement par points de séquence (et c'est une histoire totalement distincte).
La priorité d'opérateur/associativité vous indique simplement quels opérandes appartiennent à quels opérateurs. Par exemple, l'expression a = b++
peut être formellement interprétée comme (a = b)++
et comme a = (b++)
. La priorité d'opérateur/associativité est ce cas vous indique simplement que cette dernière interprétation est correcte et que la première est incorrecte (c'est-à-dire ++
s'applique à b
et non au résultat de a = b
).
Cela ne signifie pas, une fois de plus, que b
doit être incrémenté en premier. La précédence/l'associativité de l'opérateur, encore une fois, a à voir avec ce qui se passe "en premier" et ce qui se passe "en suivant". Il vous indique simplement que le résultat de l'expression b++
est affecté à a
. Par définition, le résultat de b++
(incrément de suffixe) correspond à la valeur d'origine de b
. Voilà pourquoi a
va obtenir la valeur originale de b
, qui est 1. Lorsque la variable b
sera incrémentée est complètement hors de propos, tant que a
est attribué, b
« s valeur originale.Le compilateur est autorisé à évaluer cette expression dans n'importe quel ordre et incrémenter b
à tout moment: tout va, tant que a
obtient la valeur (et personne ne se soucie vraiment comment ça fonctionne "en quelque sorte" en interne).
Par exemple, le compilateur peut évaluer a = b++
comme la séquence suivante d'opérations élémentaires
(1) a := b
(2) b := b + 1
ou il peut l'évaluer comme suit
(1) b := b + 1
(2) a = b - 1
Notez que dans le premier cas b
est en fait incrémentée à la fin, tandis que dans le second cas b
est incrémenté en premier. Mais dans les deux cas a
obtient la même valeur correcte - la valeur d'origine de b
, qui est ce qu'il devrait obtenir.
Mais je dois réitérer que les deux exemples ci-dessus sont ici seulement à des fins d'illustration. En réalité, les expressions comme a = ++b
et a = b++
n'ont pas de points de séquence à l'intérieur, ce qui signifie que de votre point de vue tout ce qui se passe dans ces expressions simultanément . Il n'y a pas de "avant", "après", "premier", "suivant" ou "dernier". De telles expressions sont "atomiques" dans un sens qu'elles ne peuvent pas être décomposées de manière significative en une séquence de plus petites étapes.
'L'associativité de l'opérateur vous indique simplement quels opérandes appartiennent à quels opérateurs' ...... La précédence de l'opérateur indique que l'associativité de l'opérateur ..not. L'associativité des opérateurs entre en jeu lorsque des opérateurs ont la même priorité. Dans ce cas, «++» a une priorité plus élevée que '=' donc 'a = b ++' est interprété comme 'a = (b ++)' –
@Prasoon Saurav: Chaque fois que l'associativité de l'opérateur "entre en jeu", elle vous dit toujours quels opérandes appartiennent à quels opérateurs. En fait, le langage C n'a pas de «priorité d'opérateur» et «d'associativité d'opérateur». Vous ne trouverez rien de tel dans la norme. Le langage C a une grammaire qui définit tout. "Associativité" et "préséance" ne sont rien d'autre qu'une tentative de présenter les règles de la grammaire sous une forme plus lisible. L'associativité et la précédence ont les mêmes racines et font la même chose. – AnT
J'apprécie votre point de vue. 'Par exemple, l'expression a = b ++ peut être formellement interprétée comme (a = b) ++ et comme = (b ++)' et c'est à cause de la priorité de l'opérateur non pas à cause de l'associativité de l'opérateur. –