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 :

post incrementation, pas clair


Sujet :

C++

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 250
    Points : 259
    Points
    259
    Par défaut post incrementation, pas clair
    Bonjour,

    Dans un programme, je lis une instruction du type:
    toto = (toto++)%5;

    est-ce bien equivalent a :
    toto = toto%5;
    toto++;

    ou a autre chose ???

    Merci d'avance

  2. #2
    Expert éminent
    Avatar de elitost
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2003
    Messages
    1 985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 985
    Points : 6 566
    Points
    6 566
    Par défaut
    Si ça fonctionne comme en Java , oui c'est équivalent.

  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
    Points : 1 051
    Points
    1 051
    Par défaut
    Oui.
    Personnellement je n'aime pas du tout ce genre de philosophie "en écrire le plus possible sur une seule ligne". Pour peu qu'une expression soit un peu plus complexe que ça et que le développeur n'ai pas pris le temps de commenter, c'est parfait pour perdre du temps lors de la relecture.

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par _vince_ Voir le message
    toto = (toto++)%5;
    Il me semble que c'est un comportement indéfini en C++, car la variable toto est modifiée deux fois dans la même instruction. Si quelqu'un peut confirmer...
    toto = toto%5;
    toto++;
    Cette écriture est de toute façon à préférer, car elle est plus claire et sans ambigüité.

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    L'incrémentation ne sert a rien puisque toto sera de toute façon réaffecté avec le résultat de l'opération.
    Ce serait plutôt équivalent à ça :

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2005
    Messages : 92
    Points : 108
    Points
    108
    Par défaut
    Je dirais plutôt que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    toto = ++toto % 5
       serait équivalent à
    toto = (toto + 1) % 5;
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    toto = toto++ % 5
       serait équivalent à
    toto = toto % 5;
    toto = toto + 1;
    Mais je ne suis pas sûr non plus que l'incrémentation se fasse avant l'assignation ou vice-versa, et peut-être que ce n'est pas défini.

    Donc +1 pour une forme plus explicite.

  7. #7
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Août 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Août 2007
    Messages : 52
    Points : 53
    Points
    53
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    toto = ++toto % 5
       serait équivalent à
    toto = (toto + 1) % 5;
    OUI


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    toto = toto++ % 5
       serait équivalent à
    toto = toto % 5;
    toto = toto + 1;
    Non l'incrémentation se fait au moment du calcul donc c'est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    titi = toto % 5;
    toto = toto + 1;
    toto = titi
    donc le toto++ ne sert à rien

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Moi je parie sur l'indéfinie

    toto = toto++ % 5
    peut aussi bien être équivalent à :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    toto = toto % 5;
    toto = toto + 1;
    que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tmp = toto % 5;
    toto = toto +1;
    toto = tmp;

  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
    Points : 1 051
    Points
    1 051
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        int x=7; 
        x=(x++)%5;
     
        int y=7; 
        y=(y)%5;
    Bizare, sur mon compilateur j'ai x=3 et y=2.
    Donc je pense comme Mongaulois

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    tu regarder ce thread
    ca commence ici
    http://www.developpez.net/forums/sho...&postcount=229

    et ca en parle mieux a partir d'ici
    http://www.developpez.net/forums/sho...40#post2473540

  11. #11
    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
    Citation Envoyé par Sylvain Togni Voir le message
    Il me semble que c'est un comportement indéfini en C++, car la variable toto est modifiée deux fois dans la même instruction. Si quelqu'un peut confirmer.
    Confirmé. Pour être plus précis, modifier deux fois une variable sans point de séquencement entre est un comportement indéfini de même que lire une variable et la modifier sauf si la lecture est nécessaire à la détermination de la nouvelle valeur (par exemple a++ + a)

  12. #12
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Confirmé. Pour être plus précis, modifier deux fois une variable sans point de séquencement entre est un comportement indéfini de même que lire une variable et la modifier sauf si la lecture est nécessaire à la détermination de la nouvelle valeur (par exemple a++ + a)
    a++ && a+=3
    n'est pas indéfinie??

  13. #13
    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
    Citation Envoyé par Mongaulois Voir le message
    a++ && a+=3
    n'est pas indéfinie??
    Ca compile pas: la grammaire interprètre cela comme (a++&&a) += 3.

  14. #14
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Ca compile pas: la grammaire interprètre cela comme (a++&&a) += 3.
    (za++)&&(za *= 3);

  15. #15
    Membre régulier Avatar de gelam
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2003
    Messages : 69
    Points : 74
    Points
    74
    Par défaut
    Citation Envoyé par NiamorH Voir le message
    Oui.
    Personnellement je n'aime pas du tout ce genre de philosophie "en écrire le plus possible sur une seule ligne". Pour peu qu'une expression soit un peu plus complexe que ça et que le développeur n'ai pas pris le temps de commenter, c'est parfait pour perdre du temps lors de la relecture.
    Je crois que cet echange démontre clairement le point de vue (philosophie) de NiamorH.
    Perdre du temps pour comprendre queque chose d'aussi trivial n'est pas enrichissant.
    Pour moi les opérateurs d'incrémentations doivent figurer seuls et ne pas apparaître dans une expression.

  16. #16
    Membre actif
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 250
    Points : 259
    Points
    259
    Par défaut
    Citation Envoyé par gelam Voir le message
    Je crois que cet echange démontre clairement le point de vue (philosophie) de NiamorH.
    Perdre du temps pour comprendre queque chose d'aussi trivial n'est pas enrichissant.
    Pour moi les opérateurs d'incrémentations doivent figurer seuls et ne pas apparaître dans une expression.
    Je suis bien d'accord avec toi. Mais je maintiens/debug un code ecrit par d'autres qui ne pensent pas comme nous

    Je vais essayer de retrouver l'intention du programmeur d'une autre maniere...
    Merci a tous pour ces echanges.

  17. #17
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par gelam Voir le message
    Je crois que cet echange démontre clairement le point de vue (philosophie) de NiamorH.
    Perdre du temps pour comprendre queque chose d'aussi trivial n'est pas enrichissant.
    Justement c'est pas trivial pour tout le monde, sinon on ne verrai pas ce genre de code.

    Citation Envoyé par gelam Voir le message
    Pour moi les opérateurs d'incrémentations doivent figurer seuls et ne pas apparaître dans une expression.
    c'est toujours plus prore

Discussions similaires

  1. [Dates] Pb avec dates, aides pas claires en fait :(
    Par zax-tfh dans le forum Langage
    Réponses: 4
    Dernier message: 10/09/2005, 13h55
  2. [XSLT][Compteur]qui ne s'incremente pas
    Par fraoustin dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 10/01/2005, 18h11
  3. Posté ou pas posté?
    Par gdavin dans le forum ASP
    Réponses: 4
    Dernier message: 02/04/2004, 11h18
  4. Trucs pas claire
    Par Freakazoid dans le forum DirectX
    Réponses: 2
    Dernier message: 09/07/2003, 21h10

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