4
votes

Qu'est-ce que "La variable 'i' n'a pas été déclarée dans la portée" en C ++?

En pratiquant le code C ++, j'ai utilisé la variable qui a été déclarée dans la boucle for.Je veux qu'elle l'utilise à nouveau dans une autre boucle for. Mais cela m'a montré une erreur que le

la variable i n'a pas été déclarée dans la portée

et j'ai essayé la même boucle dans Eclipse IDE qu'elle m'a montré

le symbole i n'a pas été résolu .

L'exemple de code ressemble à ceci:

 #include<iostream>

    using namespace std;

    int main(){
        for(int i=0;i<10;i++){
            cout<<i;
        }
        for(i=10;i<20;i++){
            cout<<i;
        }
    }


9 commentaires

Vous devez le déclarer à nouveau dans la deuxième boucle, car il sort du champ d'application après la première boucle.


i n'existe que à l'intérieur de la première boucle, car vous l'avez déclarée là. Essayer de l'utiliser dans la deuxième boucle vous donne l'erreur. Si vous déplacez le int i; avant cette boucle, ou si vous le redéclarez dans la deuxième boucle, cela fonctionnerait.


travaille pour moi. J'utilise Visual Studio 6;)


Ressemble à la boucle var et for de JS. :-)


@virgesmith: Oui, c'est un bogue dans ce compilateur.


@Bathsheba, je sais. Je n'ai pas utilisé VS6 pendant des années d'ânes, mais la douleur de réparer tout ce qui n'est pas conforme est toujours d'actualité.


en fait pas mon affaire, mais à mon avis, la modification n'était pas vraiment une amélioration (en particulier la question dans le titre a été changée en quelque chose qui a certainement un doublon)


@ user463035818 En fait, ils avaient une raison de changer le titre. Donc c'est d'accord


la question qui est maintenant dans le titre a une réponse par exemple ici: stackoverflow.com/questions/10056093/... (je voterais pour un doublon si cela ne fermait pas la question immédiatement), mais le titre avant était mieux pour décrire votre question exacte


3 Réponses :


5
votes

Vous devez déclarer la variable pour chaque portée:

int main(){
    for(int i=0;i<10;i++){
        cout<<i;
    }
    cout<<i; // Error
}

Après la première boucle, il n'y a plus de i . Vous pouvez essayer ce que dit le compilateur et voir que cela échouera:

#include<iostream>

using namespace std;

int main(){
    for(int i=0;i<10;i++){
        cout<<i;
    }
    for(int i=10;i<20;i++){
        cout<<i;
    }
}


0 commentaires

3
votes

En écrivant for (int i = 0; i vous déclarez le int i dans le for code> et cela n'a d'effet qu'à l'intérieur de la boucle for .

Si vous voulez réutiliser le int i , vous devez le placer en dehors de & avant n'importe quelle boucle for :

#include<iostream>

using namespace std;

int main(){
    for(int i=0; i<10; i++){
        cout<<i;
    }
    for(int i=10; i<20; i++){
        cout<<i;
    }
    //cout<<i; <- oops!!! error
}

Ou, répétez simplement la déclaration avec chaque boucle for puis int i dans les boucles for sont des variables totalement différentes.

#include<iostream>

using namespace std;

int main(){
    int i = 0;
    for(i=0; i<10; i++){
        cout<<i;
    }
    for(i=10; i<20; i++){
        cout<<i;
    }
    cout<<i; // <- fine, 20
}


0 commentaires

4
votes

i défini uniquement dans la portée de la première boucle for , il doit donc être re-déclaré dans la seconde.

p> Les premiers compilateurs Microsoft C ++ avaient un bogue où le i fuyait dans la portée de la boucle for pour produire efficacement

int i;
for (i = 0; i < 10; i++){


3 commentaires

voulez-vous dire que i fuit hors la portée de la boucle for? Ou était-ce que le bogue concernant i d'une boucle fuyait dans la portée de la boucle suivante?


@ user463035818: J'ai mis le code équivalent. Pour autant que je me souvienne, l'initialisation de i a eu lieu dans la boucle itslef.


intéressant, je suppose que cela peut causer toutes sortes de bugs déroutants, par contre il devrait y avoir une erreur si i a déjà été déclaré dans la portée externe