int x = 10;
x += x--;
En C#/.Net, pourquoi est-ce que ça égale ce que ça égale ? (Je ne donne volontairement pas la réponse pour que vous puissiez deviner et voir si vous avez raison).
int x = 10;
x += x--;
En C#/.Net, pourquoi est-ce que ça égale ce que ça égale ? (Je ne donne volontairement pas la réponse pour que vous puissiez deviner et voir si vous avez raison).
Regardez cette déclaration :
x += x--;
Ceci est équivalent à :
x = x + x--;
Ce qui est équivalent à :
int a1 = x; // a1 = 10, x = 10
int a2 = x--; // a2 = 10, x = 9
x = a1 + a2; // x = 20
Alors x
est de 20 après - et c'est garanti par la spécification.
Qu'est-ce que également Il est pratiquement garanti, bien que cela ne soit pas prévu par la spécification, que toute personne utilisant un tel code sera attaquée par ses collègues. Oui, c'est bien que le résultat soit prévisible. Non, ce n'est pas bien de utiliser ce genre de code.
Jon a bien sûr raison.
Une bonne façon d'y penser est de se souvenir :
1) les sous-expressions sont toujours évaluées de gauche à droite . Période. L'évaluation d'une sous-expression peut induire un effet secondaire.
2) l'exécution des opérateurs se fait toujours dans l'ordre indiqué par les parenthèses, la précédence et l'associativité. L'exécution des opérateurs peut induire un effet secondaire.
Le "x" à gauche du += est la sous-expression la plus à gauche, et donc la règle (1) s'applique. Sa valeur est calculée en premier -- 10.
Le x-- à droite du += est le suivant dans l'ordre de gauche à droite, il est donc évalué ensuite. La valeur de x-- est 10, et l'effet secondaire est que x devient 9. C'est normal, car -- a une plus grande priorité que +=, son effet secondaire est donc évalué en premier.
Enfin, l'effet secondaire de += s'exécute en dernier. Les deux opérandes étaient 10 et 10, le résultat est donc d'affecter 20 à x.
Je reçois des questions à ce sujet tout le temps. N'oubliez pas que les règles sont très simples : sous-expressions de gauche à droite, opérateurs dans l'ordre de préséance, point.
En particulier, notez que le raisonnement couramment énoncé "l'opérateur -- est postfixe et s'exécute donc après tout le reste" est un raisonnement incorrect. J'explique pourquoi c'est incorrect dans les articles ci-dessous.
Voici quelques articles que j'ai écrits sur ce sujet :
http://blogs.msdn.com/ericlippert/archive/tags/precedence/default.aspx
De la Spécifications 7.13.2
Si le type de retour de l'opérateur sélectionné est implicitement convertible en type de x, l'opération est évaluée comme x = x op y, sauf que x n'est évalué qu'une seule fois.
Votre déclaration est donc équivalente à x = x + x--;
qui est évalué dans l'ordre de gauche à droite et donne la réponse 20.
Notez qu'il existe également une différence entre --x
y x--
ici. Si vous aviez écrit x += --x;
cela serait équivalent à x = x + --x
alors vous obtiendrez 19. Ceci est dû au fait que la valeur de x est décrémentée et que la valeur résultante est utilisée dans l'expression (à la différence de x--
où la valeur originale de x est utilisée dans l'expression).
Cette expression x = x + --x + x
donnera 28 parce que le troisième fois la quatrième fois (voir commentaires) que x est évalué, il vaut 9.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.