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 :

boucle for: ++i ou i++


Sujet :

C++

  1. #1
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut boucle for: ++i ou i++
    Bonjour à tous,

    j'ai une question qui n'est pas vraiment importante, c'est juste par curiosité.
    Dans une boucle for du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (int i=0; i<iMax; i++ /*ou ++i*/ )
    {
       monVecteur[i] = 0;
    }
    Quelle est la différence entre ++i et i++ (s'il y en a, car j'ai testé, et je n'en ai vu aucune)?

    merci.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  2. #2
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164

  3. #3
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Oui certes, mmh.. j'ai dû mal poser ma question. Je vais donc la reformuler:

    J'ai testé ces deux boucles:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (int i =0; i<10; i++){tab[i]=1;}
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (int i =0; i<10; ++i){tab[i]=1;}
    Je pensais qu'il y aurait une différence au niveau du premier et dernier élément de mon tableau, mais il n'en est rien. Apparemment, les deux boucles sont identiques.

    Pourtant, il doit bien y avoir une différence, ne serait-ce qu'au niveau de la compilation. Qu'en pensez-vous?
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  4. #4
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    La difference entre i++ et ++i n'est que pour l'expression en cours. Comme ici cette expression est reduite a i++ ou ++i, il n'y a pas de difference visible.

    Pour des classes (par exemple des iterateurs) ++i peut avoir a faire moins de travail que i++ (puisqu'il ne faut pas retourner l'ancienne valeur) et donc la tendance c'est repandue en C++ de faire plutot ++i que i++ dans ce genre de contextes. Ceux qui ont essayer de mesurer la difference ont rarement trouve quelque chose de significatif.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  5. #5
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    avec les itérateurs, il vaut mieux utilser ++i pour des raisons de performance (i++ crée une copie de i, pas ++i).
    dans les autres cas (pointeurs ou indice d'un tableau) ça ne change rien.

    [edit]oups je n'avais pas vu le post précédent[/edit]

  6. #6
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Donc, selon vous, dans le cas d'un simple entier, le code asm généré sera absolument identique dans les deux cas?
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  7. #7
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    Citation Envoyé par jmv
    dans les autres cas (pointeurs ou indice d'un tableau) ça ne change rien.
    Vraiment ? (je ne vois pas pourquoi la copie faite avant le return "sauterait" dans le cas des pointeurs ou des types de base). A mon avis, c'est forcément plus négligeable qu'avec la copie d'un iterateur, mais il y a quand même une copie ....

    Par contre, est-ce que le compilateur n'optimiserait pas lui-même tous les appels a l'operateur de post-incrémentation, quand une pre-incrémentation suffit ? (j'imagine qu'il suffit de regarder si la valeur de la variable est utilisée ailleurs dans l'expression courante)
    And still we will be here, standing like statues ...

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Dans le cas d'un type simple, ça ne change rien parce que l'optimisateur peut voir que la valeur de retour n'est pas affectée, et donc supprimer cette copie.
    Dans le cas d'un type complexe, ce n'est plus possible, il est peut-être du souhait de l'utilisateur que le constructeur de copie de l'objet soit appelé, ainsi que son destructeur.

  9. #9
    Candidat au Club
    Inscrit en
    Février 2005
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 2
    Points : 2
    Points
    2
    Par défaut i++ ++i
    la difference n est que le syntaxe mais tu demande a lordinateur de faire le meme travail donc tu as le meme resultat si tu ajoute 1 a p ++p
    si tu ajout a la valeur p 1 p++ donc tu voie c est la meme chose

  10. #10
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    Citation Envoyé par pacoco
    si tu ajoute 1 a p ++p
    si tu ajout a la valeur p 1 p++
    Euh, j'espère avoir mal compris
    ++i et i++ ne marchent pas comme ça.

    C'est plutôt (si on explique rapidement):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ++i
    {
        i = i+1;
        return i;
    }
     
    i++
    {
        tmp = i;
        i = i+1;
        return tmp;
    }
    Donc dans le second cas, l'operateur retourne la valeur non-incrémentée.
    And still we will be here, standing like statues ...

  11. #11
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    bon, j'avais laissé ce sujet ouvert au cas où quelqu'un n'ait quelque chose à rajouter. Il semble que ce ne soit plus le cas. Je le clos donc.

    à tous
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Boucle for dans un script cmd
    Par nicolas.ganache dans le forum Développement
    Réponses: 4
    Dernier message: 19/07/2004, 16h07
  2. Réponses: 3
    Dernier message: 06/07/2004, 10h21
  3. [Debutant] Batch et Boucle for
    Par ludovic.fernandez dans le forum Scripts/Batch
    Réponses: 8
    Dernier message: 06/05/2004, 19h21
  4. [Swing][boucles] for, do, if .....comment faire simple?
    Par chastel dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 02/05/2004, 22h49
  5. [langage] boucle "for" modification du pas
    Par K-ZimiR dans le forum Langage
    Réponses: 4
    Dernier message: 29/04/2004, 11h54

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