web-dev-qa-db-fra.com

Résultat de l'exercice d'interview intéressant: retour, post incrément et comportement de référence

Voici un code d'application de console simple, qui renvoie un résultat que je ne comprends pas complètement.

Essayez de penser s'il sort 0, 1 ou 2 dans la console:

using System;

namespace ConsoleApplication
{
    class Program
    {
        static void Main()
        {
            int i = 0;
            i += Increment(ref i);

            Console.WriteLine(i);
            Console.ReadLine();
        }

        static private int Increment(ref int i)
        {
            return i++;
        }
    }
}

La réponse est 0.

Ce que je ne comprends pas, c'est pourquoi post increment i++, à partir de la méthode Increment, qui est exécutée sur un ref (pas sur une copie de la variable transmise) incrémente la variable, mais est simplement ignorée ultérieurement.

Ce que je veux dire est dans cette vidéo:

 

Quelqu'un peut-il expliquer cet exemple et pourquoi, lors du débogage, je vois que la valeur est incrémentée à 1, mais qu'elle revient ensuite à 0?

59
Aremyst

i += Increment(ref i); est équivalent à

i = i + Increment(ref i);

L’expression à droite de l’affectation est évaluée de gauche à droite, l’étape suivante est donc

i = 0 + Increment(ref i);

return i++ renvoie la valeur actuelle de i (qui est 0), puis incrémente i

i = 0 + 0;

Avant l'affectation, la valeur de i est 1 (incrémenté dans la méthode Increment), mais l'affectation la rend à nouveau égale à 0.

102
Jakub Lortz

je pense que la "magie" est juste priorité d'opération l'ordre des opérations

i += Increment(ref i)

est le même que 

i = i + Increment(ref i)

l'opération + est exécutée de gauche à droite

nous prenons donc d'abord ... ce qui est 0 à ce moment-là ...

puis nous ajoutons le résultat de Incrément (réf i) ... qui vaut également 0 ... 0 + 0 = 0 ... mais attendez ... avant d'obtenir ce résultat, i est réellement incrémenté ...

cette incrémentation a lieu une fois que l'opérande gauche de notre opération + a été évalué ... donc il ne change rien ... 0 + 0 est toujours à 0 ... donc on lui attribue 0 après l'exécution de l'opération +

18
DarkSquirrel42

Comme vous l'avez mentionné - postincrement "i ++". instruction - "return i ++;" définira la valeur de «i» en mémoire après le retour de la valeur d'origine.

essayez d'utiliser "return ++ i;" et probablement vous l'obtiendrez.

0
Debsdoon