La seule réponse à votre question qui est correcte est: Parce qu'elle n'est pas définie.
Ok, avant que vous ne me brûliez tous ..
Vous avez tous répondu pourquoi il i+=i++
est logique et logique d'en résulter i=0
.
J'ai été tenté de voter contre chacune de vos réponses, mais la réputation que j'ai calculée serait trop élevée.
Pourquoi je suis tellement en colère contre vous les gens? pas à cause de ce que vos réponses expliquent ..
Je veux dire, chaque réponse que j'ai lue avait fait un effort remarquable pour expliquer l'impossible, I Applaudissements!
Mais quel est le résultat ?? est-ce un résultat intuitif - est-ce un résultat acceptable ??
Chacun de vous a vu le «roi nu» et l'a accepté en quelque sorte comme un roi rationnel.
Vous avez tous tort!
i+=i++;
résultat 0
n'est pas défini.
un bug dans le mécanisme d'évaluation du langage si vous voulez .. ou pire encore! un bug dans la conception.
voulez une preuve? bien sûr que vous voulez!
int t=0; int i=0; t+=i++; //t=0; i=1
Maintenant ceci ... est un résultat intuitif! parce que nous avons d'abord évalué l' t
attribué avec une valeur et ce n'est qu'après l'évaluation et l'affectation que nous avons eu l'opération postérieure - rationnelle, n'est-ce pas?
est-il rationnel que: i=i++
et i=i
donne le même résultat pour i
?
tandis que t=i++
et t=i
ont des résultats différents pour i
.
L'opération de post est quelque chose qui devrait se produire après l'évaluation de l'instruction.
Par conséquent:
int i=0;
i+=i++;
Devrait être le même si nous écrivions:
int i=0;
i = i + i ++;
et donc le même que:
int i=0;
i= i + i;
i ++;
et donc le même que:
int i=0;
i = i + i;
i = i + 1;
Tout résultat qui 1
n'indique pas un bogue dans le compliant ou un bogue dans la conception du langage si nous optons pour une pensée rationnelle - cependant MSDN et de nombreuses autres sources nous disent "hé - ce n'est pas défini!"
Maintenant, avant de continuer, même cet ensemble d'exemples que j'ai donné n'est soutenu ou reconnu par personne. Cependant, c'est ce qui, selon la manière intuitive et rationnelle, aurait dû être le résultat.
Le codeur ne doit pas savoir comment l'assemblage est écrit ou traduit!
S'il est écrit d'une manière qui ne respecte pas les définitions du langage - c'est un bug!
Et pour terminer, j'ai copié cela à partir de Wikipedia, Opérateurs d'incrémentation et de décrémentation :
Puisque l' opérateur d' incrémentation / décrémentation modifie son opérande, l'utilisation d'un tel opérande plus d'une fois dans la même expression peut produire des résultats indéfinis . Par exemple, dans des expressions telles que x - ++ x, il n'est pas clair dans quelle séquence les opérateurs de soustraction et d'incrémentation doivent être effectués. Des situations comme celle-ci sont encore aggravées lorsque des optimisations sont appliquées par le compilateur, ce qui peut entraîner un ordre d'exécution des opérations différent de celui prévu par le programmeur.
Et donc.
La bonne réponse est que cela NE DEVRAIT PAS ÊTRE UTILISÉ! (car il n'est PAS DÉFINI!)
Oui .. - Il a des résultats imprévisibles même si le compliant C # essaie de le normaliser d'une manière ou d'une autre.
Je n'ai trouvé aucune documentation de C # décrivant le comportement que vous avez tous documenté comme un comportement normal ou bien défini du langage. Ce que j'ai trouvé, c'est exactement le contraire!
[ copié de la documentation MSDN pour les opérateurs d'incrémentation et de décrémentation de Postfix: ++ et - ]
Lorsqu'un opérateur suffixe est appliqué à un argument de fonction, la valeur de l'argument n'est pas garantie d'être incrémentée ou décrémentée avant d'être transmise à la fonction. Voir la section 1.9.17 dans la norme C ++ pour plus d'informations.
Remarquez ces mots non garantis ...
Pardonnez-moi si cette réponse semble arrogante - je ne suis pas une personne arrogante. Je considère simplement que des milliers de personnes viennent ici pour apprendre et les réponses que je lis les induiront en erreur et nuiront à leur logique et à leur compréhension du sujet.