Jetons un coup d'oeil à l'intermédiaire le code de langue pour que:
IL_0000: nop
IL_0001: ldc.i4.s 2A
IL_0003: stloc.0 // c
IL_0004: ldloc.0 // c
Cela charge la constante de type entier 42
sur la pile, puis les stocke dans la variable c
, et le charge à nouveau sur la pile.
IL_0005: stloc.1
IL_0006: ldloc.1
Cette fonction permet de copier la valeur dans un autre registre, et aussi beaucoup de nouveau.
IL_0007: ldc.i4.1
IL_0008: add
Cela ajoute de la constante de 1 chargé de la valeur
IL_0009: stloc.0 // c
... et stocke le résultat (43) dans la variable c
.
IL_000A: ldloc.1
IL_000B: stloc.0 // c
Ensuite, la valeur de l'autre registre est chargé (c'est encore de la de 42!) et stockée dans la variable c
.
IL_000C: ldloc.0 // c
IL_000D: call System.Console.WriteLine
IL_0012: nop
IL_0013: ret
Ensuite, la valeur (42) est chargé à partir de la variable, et imprimé.
Donc vous pouvez voir, c'est que tout c++
incrémente la variable par un après le résultat fut de retour, que l'incrémentation se passe toujours avant assinging la valeur de la variable. Si la séquence est plus comme ceci:
- Obtenir la valeur de
c
- La Post-incrémentation
c
- Attribuer auparavant de lire la valeur de
c
Et qu'il faut expliquer pourquoi vous obtenez ce résultat :)
Pour ajouter un exemple de plus, depuis que cela a été mentionné dans un commentaire qui a été depuis supprimée:
c = c++ + c;
Cela fonctionne de façon très similaire: en Supposant une valeur initiale de 2 encore une fois, le côté gauche de l'addition est évalué en premier. Si la valeur est lue à partir de la variable (2), puis c
est incrémenté (c
devient 3). Puis le côté droit de l'outre-ci est évaluée. La valeur de c
est lire (maintenant 3). Ensuite, l'ajout (2 + 3) et le résultat (5) est affectée à la variable.
Les plats à emporter à partir de ce que vous devriez éviter de mélanger d'incrémentation et de décrémentation des opérations normales d'expressions. Certes, le comportement est très bien défini et fait sens absolu (comme illustré ci-dessus), il est encore parfois difficile pour envelopper votre tête autour de lui. Surtout quand vous assigner quelque chose à la même variable que vous incrémenter dans l'expression, cela devient confus rapidement. Donc, ne vous-même et d'autres personnes une faveur et éviter d'incrémenter/décrémenter les opérations lorsqu'ils ne sont pas complètement sur leur propre :)