0
votes

Accéder aux variables ombrées de la portée intérieure

Mon code:

int num = 1; // global scope
int main(){
      int num = 2;                         // local scope 1
           {                              // local scope 2
             int num = 3;
              {                          // local scope 3
                  int num = 4;
                   std::cout<<num<<"\n";            // printing local scope 3
                   std::cout<<::num<<"\n";         // printing global scop 
                   // but here how to print local scope 1, 2 variables
               }
           }


5 commentaires

Ceci n'est tout simplement pas possible, car vous ourdez la portée1, 2 num s, et ils ne peuvent être qualifiés par des noms de noms. Vous devez les renommer pour entrer dans la portée 3.


Pourquoi ne pas pousser ces variables sur une pile et gérer la pile automatiquement dans chaque portée?


Avoir le même nom pour les variables qui entraînent une observation variable, c'est généralement une mauvaise idée, car elle diminue la lisibilité et la maintenabilité. Ayant cela indique que vous devriez changer le schéma de dénomination ou pour fractionner la fonction.


Utilisez une fonction récursive et faites-le chaque fonction Imprimer Num alors qu'il se déroule?


Quelle portée voulez-vous accéder à quel point? Et pouvez-vous donner un meilleur exemple?


6 Réponses :


6
votes

Vous ne pouvez pas simplement y parvenir que la variable interne n'échange que votre variable de portée extérieure.

Si un bloc intérieur déclare une variable avec le même nom que la variable déclarée par le bloc externe, la visibilité de la variable de bloc extérieur se termine au point de la déclaration par bloc interne.

Toutefois, si vous avez toujours besoin d'y parvenir, vous pouvez faire quelque chose pour stocker les valeurs variables dans une pile qui enregistre les valeurs variables par portée. C'est quelque chose de similaire à ce qui se fait lors des appels de fonction (juste une version révisée pour stocker uniquement la variable requise).

Je vous suggérerais toujours que vous utilisiez plutôt un nom distinct pour les variables, car cela réduit la lisibilité du code.


0 commentaires

-1
votes

C'est probablement quelque chose comme une tâche de hacker. J'ai passé du temps à traiter avec des pointeurs, etc. et j'ai obtenu une solution: xxx

et je reçois la sortie suivante: xxx < p> Bien entendu, les adresses changent de course à la course, mais l'accès à num (2) est obtenu :)

SO NUM (1), NUM (2), NUM (3) sont stockés dans une rangée". Et probablement, cela échouera sur un autre compilateur. Mais de toute façon c'est une belle chose à penser :)


0 commentaires

0
votes

Ce n'est pas tout à fait clair ce que vous voulez exactement. Vous utilisez le mot récursion, mais vous n'utilisent pas de récursion.

Cependant, je pense que ce que vous décrivez et que vous voulez convenir à une fonction récursive. Peut-être que quelque chose comme ce qui suit faire ce que vous voulez? xxx


0 commentaires

0
votes

question intéressante, qu'en est-il de cela (ne faites pas cela dans le code de production), Lambdas peut être déclaré sans () être appelé Thru opérateur () et jamais attribué : xxx

https://godbolt.org/z/jbhytfled


0 commentaires

1
votes

Utilisez simplement votre portée:

int num = 1; // global scope

int main() {

    int num = 2;                        
    {                             
        int num = 3;
        {                          
            int num = 4;
            std::cout << num << '\n';                       
           
        }
        std::cout << num << '\n';          
    }
    std::cout << num << '\n' << ::num;          
    
    return 0;
}


0 commentaires

1
votes

comme l'utilisateur JasMeet a souligné, vous ne pouvez tout simplement pas le faire directement. Cependant, indirectement, il y a une solution de contournement, mais il appellerait l'utilisation d'un conteneur ... xxx

sortie xxx < / pré>


0 commentaires