59 votes

Résultat d'exercice d'entrevue intéressant: retour, post-incrémentation et comportement de référence

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

Essayez de penser qu'elle renvoie 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 un post incrément i++, à partir de l' Increment méthode, qui est exécuté sur un ref (pas sur une copie de la variable) ne incrémenter la variable, mais il est juste ignoré plus tard.

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



Quelqu'un peut-il expliquer cet exemple, et pourquoi, lors de debug, je vois que la valeur est incrémentée de 1, mais alors, il revient à 0?

102voto

Jakub Lortz Points 10130

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

i = i + Increment(ref i);

L'expression sur le côté droit de l'affectation est évaluée de gauche à droite, de sorte que la prochaine étape est

i = 0 + Increment(ref i);

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

i = 0 + 0;

Avant la cession, la valeur de i 1 (incrémenté dans l' Increment méthode), mais le travail rend de nouveau 0.

18voto

DarkSquirrel42 Points 4090

je pense que la "magie" ici, est juste opération de précédence l'ordre des opérations

i += Increment(ref i)

est le même que

i = i + Increment(ref i)

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

donc, nous avons d'abord prendre l'i ... qui est 0 à l'époque ...

puis on ajoute le résultat de l'Incrémentation(ref i) ... qui est aussi 0 ... 0+0=0 ... mais attendez ... avant de nous obtenir ce résultat que j'ai est réellement augmenté ...

cette augmentation intervient après l'opérande de gauche de notre opération + a ben évalué ... afin de ne pas changer une chose ... 0+0 toujours 0 ... donc i est affecté à 0 après l'opération + a été exécuté

0voto

Debsdoon Points 19

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.

Prograide.com

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.

Powered by:

X