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 :

for ( ; end; ++) boucle bizarre


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 120
    Par défaut for ( ; end; ++) boucle bizarre
    Bonjour

    Je travaille un peu avec Irrlicht en ce moment et quand on utilise une liste avec celui-ci je vois de drôles de boucle du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    list::Iterator ait = mylist.begin();
    for ( ; ait != mylist.end(); ait++) {
      // instruction
    }
    Je sui un peu décontenancé par le fait qu'entre la parenthèse ouverte et le premier point virgule il n'y a rien.
    Pourriez-vous m'expliquer svp ?

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Le premier champ de la boucle for est évalué au moment d'entrer dans la boucle. Il sert donc en général à faire les initialisations.
    Ici la variable ait a été initialisée à la ligne précédente. Aucune autre initialisation n'étant nécessaire, ce champ est vide.

  3. #3
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    L'espace avant le premier point virgule permet d'initialiser des variables temporaires, détruites à la fin du for. Si il n'y a rien ici, c'est juste qu'il n'a pas besoin d'initialiser quoi que ce soit.

    Généralement on déclare l'iterateur à cet endroit, plutôt qu'avant le for, mais l'auteur du code a sûrement de bonnes raisons de faire comme ça.

    Par exemple il est possible qu'il y ait un break à l'intérieur du for. Si il joue le break, l'itérateur sera positionné sur l'élément qui aura fait le break, et peut être qu'ensuite, un traitement est fait. L'itérateur ne doit pas être détruit après le for pour celà, d'où l'utilité de le déclarer avant.

  4. #4
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 120
    Par défaut
    Merci pour vos lumières

  5. #5
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    Pour compléter les réponses précédentes, il faut savoir que tout les champs d'un for sont optionnels.
    Ainsi les boucles suivantes sont également parfaitement valides :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    for(;;)
    {
      //boucle infinie
    }
     
    /*
    ...
    */
     
    for(int i=10000;i--;)
    {
      //boucle qui décrémente i de 10000 à 0
    }

  6. #6
    Membre éclairé Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Par défaut
    tu as dis sa :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(int i=10000;i--;)
    {
      //boucle qui décrémente i de 10000 à 0
    }
    sa serais pas plutot sa :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(int i=10000;;i--)
    {
      //boucle qui décrémente i de 10000 à 0
    }
    je ne sais pas, je demande parce que normalement c'est le dernier champs qui dis ce qu'on fait I++, i-- , i=i+3 par ex

    Cordialement baxter

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Baxter67 Voir le message
    tu as dis sa :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(int i=10000;i--;)
    {
      //boucle qui décrémente i de 10000 à 0
    }
    Les valeurs prises par i dans la boucle sont 9999 ... 0.

    sa serais pas plutot sa :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(int i=10000;;i--)
    {
      //boucle qui décrémente i de 10000 à 0
    }
    Ca, c'est une boucle infinie qui finit normalement par generer un comportement indefini quand elle essaie de faire MIN_INT-1.

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for (list::Iterator ait = mylist.begin(); ait != mylist.end(); ait++) {
      // instruction
    }
    Tu peux faire ça aussi, qui est, à mon sens, plus propre car "ait" a une visibilité qu'au niveau de la boucle et pas ailleur.

  9. #9
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Ca n'est en rien plus propre, surtout qu'un itérateur s'incrémente par pré-incrémentation.

  10. #10
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Le for est juste un utilitaire du langage, qui peut toujours être remplacé par while
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for (AAAAAA ; BBBBBB ; CCCCCC)
       DDDDDD
    =
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    { 
       AAAAAA;
       while (BBBBBB) {  // <= 'true' si BBBBBB est vide
          DDDDDD
          CCCCCC;
       }
    }

  11. #11
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    Citation Envoyé par Baxter67 Voir le message
    tu as dis sa :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(int i=10000;i--;)
    {
      //boucle qui décrémente i de 10000 à 0
    }
    sa serais pas plutot sa :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(int i=10000;;i--)
    {
      //boucle qui décrémente i de 10000 à 0
    }
    je ne sais pas, je demande parce que normalement c'est le dernier champs qui dis ce qu'on fait I++, i-- , i=i+3 par ex

    Cordialement baxter
    Comme cela a été souligner par Jean-Marc.Bourguet toi tu créer une boucle infinie.
    Dans la version
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(int i=10000;i--;)
    {
      //boucle qui décrémente i de 9999 à 0
    }
    Sachant que les deux dernières instructions du for sont exécutées à chaque tour le i-- se décréménte bien de la façon voulu jusqu'à ce que i=0=false.

Discussions similaires

  1. Problème d'indexage dans une boucle FOR-END
    Par RAMZOON dans le forum MATLAB
    Réponses: 3
    Dernier message: 19/10/2007, 00h59
  2. Boucle FOR-END récalcitrante
    Par Stud-ENSPG dans le forum MATLAB
    Réponses: 3
    Dernier message: 23/07/2007, 11h25
  3. Décrémentation à l'aide d'une boucle FOR-END
    Par fouad192007 dans le forum MATLAB
    Réponses: 2
    Dernier message: 16/06/2007, 17h54
  4. Réponses: 3
    Dernier message: 24/05/2007, 17h56
  5. Comment optimiser plusieurs boucles FOR-END imbriquées
    Par totoc1001 dans le forum MATLAB
    Réponses: 26
    Dernier message: 13/05/2007, 17h59

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