IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Portée d'une variable dans une boucle FOR ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    Par défaut Portée d'une variable dans une boucle FOR ?
    Bonjour tout le monde,

    après quelques années de pratique du C++, je viens de découvrir un truc qui m'a laissé complétement perplexe...

    Voici le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(int i=0; i<10; i++)
    {}
    J'ai toujours appris que la portée de la variable i est limitée à celle de la boucle for. La preuve le code suivant compile correctement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(int i=0; i<10; i++)
    {}
    for(double i=0; i<10; i++)
    {}
    Donc je peux très bien redéclarer i dans une autre boucle vu que sa portée est limitée.

    Or...

    En investigant une classe à la recherche d'une exception je suis tombé sur un code qui ressemble à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(int i=0; i<10; i++)
    {}
     
    //...
    i = 4;
    Et ca compile !! Alors là j'ai rien compris. J'ai refait le test dans un projet vierge , et effectivement la variable i garde bien sa dernière valeur après la sortie de la boucle for et est réutilisable...

    Conclusion:
    Je ne comprends pas le comportement de la variable i. Parce que d'une part le compilateur agit comme si la variable est déclarée en dehors de la boucle, donc on peut y accéder. Mais en même temps je peux la redéclarer autant de fois que je veux dans d'autres boucles, donc sa portée est limitée.

    On est bien d'accord que ce code ne compile pas:
    alors pourquoi celui ci marche ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(int i=0; i<10; i++)
    {}
    for(double i=0; i<10; i++)
    {}
    Si une âme charitable a la réponse à ma question.

    Merci et bonne journée

    [EDIT] Je travaille sous Visual Studio 7

  2. #2
    Membre éclairé Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Par défaut
    C'est une excellente question et j'attend la réponse avec impatience.

  3. #3
    Membre expérimenté Avatar de DarkMolo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    207
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Maroc

    Informations forums :
    Inscription : Juillet 2006
    Messages : 207
    Par défaut
    Salut,
    T'inquiètes pas, voici un extrait d'un article parlant de la portée de variable dans une boucle:
    2.3.3 Portée d’une variable:
    Ce code provoque une erreur :

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for( int i=0; i<iLength; ++i )
       if( pszLine[i]==_T(';') )
       break;
    if( i < iLength)
    …….
    Conformément à la norme C++ la portée d’une variable, c’est le bloc ou la boucle où elle est définie.
    Donc ici après la boucle for la variable n’existe plus.
    Note : ce code était valide avec Visual C++6.0 et Visual .net 2003.
    Alors, tu comprends, c'est juste l'histoire des compilateurs M$ qui ne respectent pas les normes, je crois

  4. #4
    Membre expérimenté
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    Par défaut
    Citation Envoyé par DarkMolo
    Alors, tu comprends, c'est juste l'histoire des compilateurs M$ qui ne respectent pas les normes, je crois
    C'est ce que je me suis dis, mais n'ayant pas d'autre compilateurs sous la main j'ai pas pu vérifier.

    Ceci dit, c'est quand même trop!! Si c'est vraiment une histoire de compilateur, alors là...Bill je te félicite pas !


  5. #5
    Membre expérimenté Avatar de DarkMolo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    207
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Maroc

    Informations forums :
    Inscription : Juillet 2006
    Messages : 207
    Par défaut
    Tu sais, je ne suis pas sûr, mais par expérience, j'ai déjà eu l'occase de compiler des codes avec g++ et qui ne compilait pas sous VS C++6 rien que pour ça, j'ai dû changer un peu les:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(int i;;){}
    for(int i;;) {}
    for(int i;;) {}
    par
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(int i;;) {}
    for(int j;;) {}
    for(int k;;) {}

    Moi aussi je voudrais savoir si y'a une autre explication à celà.

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    C'est un bug connu de Visual 7, corrigé (en option) sous Visual 8.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    en option seulement ?
    C'est très gênant si on utilise un objet avec un destructeur qui doit avoir été détruit à la fin de la boucle...

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/01/2010, 16h38
  2. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 19h05
  3. Réponses: 4
    Dernier message: 29/01/2008, 11h12
  4. Réponses: 1
    Dernier message: 15/02/2007, 00h24
  5. Mettre une valeur d'une table dans une variable
    Par Raphou96 dans le forum Access
    Réponses: 5
    Dernier message: 06/02/2006, 15h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo