0
votes

Pourquoi la variable membre ne suit pas les règles de retour de la récupération?

J'utilise une récursion pour calculer deux variables. Ce qui m'a confondu, c'est lorsque je définis une variable hors de la méthode en tant que variable de membre, elle renvoie la valeur qui est attribuée à la variable au lieu de la première attribuée à la variable? Pourquoi cela arrive-t-il? XXX

Je me demande comment cela s'est-il passé? Existe-t-il d'autres règles qui influencent l'ordre de retour de la récupération? Pour moi, je pense que si seulement je n'utilise pas ou non, il devrait s'agir d'une copie de la variable de membre pour calculer. Est-ce que quelqu'un pourrait m'aider à trouver la raison? Merci beaucoup.


3 commentaires

Désolé je copie le même code deux fois. J'ai mis à jour le post! Merci!


@Grant Je pense que avant la fin de la récursivité, il utilise la dernière valeur obtenue de la méthode précédente n'utilisant pas la valeur de la variable de membre. Et le processus de débogage a montré que A est 2, 1, 0 pour le script. Le différent est que lorsque la récursivité retourne, le premier script renvoie 0,0,0,0 pendant trois fois, tandis que la seconde retourne 0,1,2


S'il vous plaît poster exemple de reproductible minimal . Il n'ya aucun moyen que le deuxième code compilait comme indiqué (vous n'avez pas affiche la version sans argument de test () qui est appelé là)


3 Réponses :


0
votes

La valeur de A code> est modifiée par test () code>. Chaque appel de test code> Utilisez la même variable A code>.

Si vous souhaitez avoir une copie, faites-la vous-même: P>

private int Test()
{
    int b = a--;
    if(a != 0)
    {
        Test();
    }
    return b;
}


1 commentaires

Peut-être que je ne me suis pas énoncé. Je veux dire dans mon cas, lors de l'utilisation d'une variable de membre dans une méthode, il suffit de faire une copie de la valeur de la variable de membre au lieu d'utiliser la même référence. Donc, il devrait obtenir le même résultat en récursivité par rapport à l'utilisation d'un int directement. Mais je reçois des différentes lors de l'utilisation de la variable membre



0
votes

Le mot clé code> est omis, cela fait ressembler la variable de membre une variable locale normale, mais ils sont différents en principe. Les variables de membre se réfèrent à la même instance.

private int Test()
{
    this.a--;
    if(this.a != 0)
    {
        this.Test();
    }
    return this.a;
}


2 commentaires

Oui, la variable de membre se réfère à la même instance. Mais je suppose que lorsque vous utilisez une variable de membre dans une méthode, il suffit de faire une copie de la valeur de la variable de membre au lieu d'utiliser la même référence. Donc, il devrait avoir le même résultat en récursives. Mais je reçois des différentes lors de l'utilisation de la variable membre


La variable locale est une copie, la variable de membre n'est pas.



1
votes

Ceci fonctionne comme prévu: xxx

Si vous ne retournez pas le résultat du test, il va simplement exécuter la méthode puis passer à l'instruction suivante de la méthode. Dans votre cas, sans Test de retour (A) Cela ne fait que rien avec le résultat du test (int A).

EDIT:

Un exemple de passage par référence pour avoir un code de travail similaire xxx


6 commentaires

Je sais sinon retour, il ira à la prochaine déclaration. Mais ce que je me demande, c'est pourquoi cela renvoie des valeurs différentes?


En C # Par défaut, un INT n'est pas adopté par référence, vous devez le spécifier explicitement. Dans votre cas, vous auriez besoin de passer un par référence (voir la réponse modifiée)


Je ne pense pas qu'une référence soit nécessaire ici car je ne suis pas destiné à transmettre la valeur de retour à la variable membre. Ce que je concerne, c'est pourquoi le test (a) et le test (3) renvoie une valeur différente dans ce cas


Si vous voulez voir exactement ce que vous voulez peut-être utiliser un point de rupture et l'exécuter étape par étape pour voir comment il se comporte. Les deux extraits de code que vous avez montrés sont complètement différents. Étant donné que le premier utilise une variable déclarée dans le programme de classe, votre méthode pourrait être annulée et ne rien renvoyer car chaque fois que vous l'appelez, cela affecte cette instance de A donc donnant un parémètre ou un retour qu'elle diminuera par 1 Chaque test () est appelé. Dans le second cas, vous donnez un parémètre appelé A afin que la méthode fonctionnera sur ce paimètre, car elle est transmise par valeur, 1/2


Peu importe que vous exécutez un test () parce que vous ne faites rien avec la valeur de celui-ci dans votre déclaration IF. C'est donc ce qui se passe dans le deuxième extrait: test (3) -> 3-- = 2, puis 2> 0 alors test (2) renvoie 1 et l'intérieur, il teste (1) et retourne 0. Cependant, vous ne l'utilise pas chaque fois que la méthode est appelée, elle quitte la déclaration IF et va à retourner A et dans le premier appel, il était égal à 2. J'espère que c'était un peu plus clair 2/2


Merci David. J'ai eu ce que vous vouliez dire et déboguer le code étape par étape. Je pense que je peux avoir le point. Merci beaucoup.