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++

  1. #1
    Membre averti
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    Points : 403
    Points
    403
    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 averti 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
    Points : 412
    Points
    412
    Par défaut
    C'est une excellente question et j'attend la réponse avec impatience.

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 207
    Points : 277
    Points
    277
    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 averti
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    Points : 403
    Points
    403
    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 actif Avatar de DarkMolo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    207
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Maroc

    Informations forums :
    Inscription : Juillet 2006
    Messages : 207
    Points : 277
    Points
    277
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    C'est un bug connu de Visual 7, corrigé (en option) sous Visual 8.

  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
    Points : 4 625
    Points
    4 625
    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...

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    "Project Properties" -> "Configuration Properties" -> "C/C++" -> "Language" -> "Force Conformance In For Loop Scope".

  9. #9
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    Citation Envoyé par loufoque
    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...
    bah tu mets une acollade ouvrante et fermante '{' '}' entre le début et la fin de ton for
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    {
    for(....)
     {
     }
    }

  10. #10
    Membre averti
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    Points : 403
    Points
    403
    Par défaut
    Citation Envoyé par la drogue c'est mal
    bah tu mets une acollade ouvrante et fermante '{' '}' entre le début et la fin de ton for
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    {
    for(....)
     {
     }
    }
    Je suis d'accord avec loufoque que ce n'est pas logique que ce soit en option. Moi quand je code du C++ je m'attends à ce que le compilateur soit conforme à la norme. Après, je veux bien qu'il y ait des options, mais que ce soit pas défaut la valeur de la norme (et non pas un comportement bizaroïde comme ça! )

    Quant à mettre des accolades autour de chaque boucle for, déjà j'aime pas trop ça (pour moi les accolades qui se baladent dans la nature c'est pas très joli mais ce n'est que mon humble avis), et puis on est d'accord qu'on ne doit pas être obligé de le faire juste parce que le compilateur ne suit pas la norme

  11. #11
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,
    Citation Envoyé par Neo41
    <snip>
    Quant à mettre des accolades autour de chaque boucle for, déjà j'aime pas trop ça (pour moi les accolades qui se baladent dans la nature c'est pas très joli mais ce n'est que mon humble avis), et puis on est d'accord qu'on ne doit pas être obligé de le faire juste parce que le compilateur ne suit pas la norme
    Je suis d'autant plus d'accord avec toi que, si tu n'y prend pas garde, tu risque de te retrouver avec une variable qui ne sera déclarée que dans tes accolades...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //code avant
    {
        int unnombre;
        for(int i...)
        {
     
        }
    }
    // normalement, unnombre étant sorti de sa portée, il n'est plus utilisable

  12. #12
    Membre confirmé Avatar de toxcct
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 434
    Points : 511
    Points
    511
    Par défaut
    Citation Envoyé par Neo41
    Je suis d'accord avec loufoque que ce n'est pas logique que ce soit en option.
    moi non plus. mais je pense qu'il ont fait ca en pensent aux millions de lignes de code déja existantes... allez savoir

  13. #13
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 279
    Points : 11 015
    Points
    11 015
    Par défaut
    Cette option existait déjà avec VC6 (*) dans mes souvenirs, et elle entrainait divers problèmes qui faisaient que je préférer renoncer aux portée bien gérées.

    (*) qui prédate légèrement la norme, ne l'oubliez pas.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Je viens de regarder dans VC6 (project settings), mais je n'ai pas trouvé l'option...

  15. #15
    Membre averti
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    Points : 403
    Points
    403
    Par défaut
    Moi je l'ai dans VC7 et elle fait bien ce qu'elle doit faire.

  16. #16
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    Citation Envoyé par koala01
    Salut,

    Je suis d'autant plus d'accord avec toi que, si tu n'y prend pas garde, tu risque de te retrouver avec une variable qui ne sera déclarée que dans tes accolades...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //code avant
    {
        int unnombre;
        for(int i...)
        {
     
        }
    }
    // normalement, unnombre étant sorti de sa portée, il n'est plus utilisable
    il y a s'adapter à une contrainte de maniere réfléchie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //code avant
    int unnombre;
    {
        for(int i...)
        {
     
        }
    }
    // normalement, unnombre étant sorti de sa portée, il n'est plus utilisable
    et s'adapter à une contrainte n'importe comment


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //code avant
    {
        int unnombre;
        for(int i...)
        {
     
        }
    }
    // normalement, unnombre étant sorti de sa portée
    , il n'est plus utilisable

  17. #17
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 279
    Points : 11 015
    Points
    11 015
    Par défaut
    Citation Envoyé par Médinoc
    Je viens de regarder dans VC6 (project settings), mais je n'ai pas trouvé l'option...
    /Za si google ne m'a pas menti.
    Cette option fai(sai?)t ça, et d'autres choses qui n'étaient pas si désirables que cela avec VC6.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Disable Language Extensions
    C'est vrai que ce n'est pas la même chose que juste s'occuper des boucles for...

  19. #19
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    En particulier, je crois qu'avec ce /Za, certains headers système ou MFC ne compilaient plus. Assez inutilisable en pratique.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Sans doute.
    Je sais qu'en warning niv.4 par exemple, <commctrl.h> fait plein de "nonstandard extension used: nameless struct/union".
    Le warning peut être désactivé, mais une extension ne peut pas être réactivée...

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