Expliquer la post-incrémentation en C #

Dupliquer possible:
Comportement et ordre d’évaluation en C #

J’ai du code

static void Main(ssortingng[] args) { int j = 0; for (int i = 0; i < 10; i++) j = j++; Console.WriteLine(j); } 

Pourquoi la réponse est 0?

Ceci est dû à la façon dont l’ incrémentation ++ fonctionne . L’ordre des opérations est expliqué dans cet article MSDN. Ceci peut être vu ici (quelqu’un me corrige s’il vous plaît si je lis la spécification sur celle-ci mal :)):

 int j = 2; //Since these are value objects, these are two totally different objects now int intermediateValue = j; j = 2 + 1 //j is 3 at this point j = intermediateValue; //However j = 2 in the end 

S’agissant d’un object de valeur, les deux objects ( j et intermediateValue ) sont alors différents. L’ancien j était incrémenté, mais comme vous avez utilisé le même nom de variable, il est perdu pour vous. Je suggérerais également de lire la différence entre les objects de valeur et les objects de référence .

Si vous aviez utilisé un nom distinct pour la variable, vous seriez mieux en mesure de voir cette répartition.

 int j = 0; int y = j++; Console.WriteLine(j); Console.WriteLine(y); //Output is // 1 // 0 

S’il s’agissait d’un object de référence avec un opérateur similaire, cela fonctionnerait probablement comme prévu. Soulignant en particulier que seul un nouveau pointeur sur la même référence est créé.

 public class ReferenceTest { public int j; } ReferenceTest test = new ReferenceTest(); test.j = 0; ReferenceTest test2 = test; //test2 and test both point to the same memory location //thus everything within them is really one and the same test2.j++; Console.WriteLine(test.j); //Output: 1 

Retour au point d’origine, cependant 🙂

Si vous procédez comme suit, vous obtiendrez le résultat attendu.

 j = ++j; 

Cela est dû au fait que l’incrément survient en premier, puis l’affectation.

Cependant, ++ peut être utilisé seul. Donc, je voudrais juste réécrire ceci comme

 j++; 

Comme cela se traduit simplement par

 j = j + 1; 

Comme son nom l’indique, la post-incrémentation s’incrémente après l’utilisation de la valeur

 y = x++; 

Selon la spécification du langage C #, cela équivaut à

 temp = x; x = x + 1; y = temp; 

Appliqué à votre problème initial, cela signifie que j rest identique après ces opérations.

 temp = j; j = j + 1; j = temp; 

Vous pouvez également utiliser la pré-incrémentation, qui fait le contraire

 x = x + 1; y = x; 

ou

 y = ++x; 

Voir les opérateurs d’incrémentation et de décrémentation Postfix sur MSDN