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 :

pourquoi ca ne fonctionne pas ?


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 94
    Points : 66
    Points
    66
    Par défaut pourquoi ca ne fonctionne pas ?
    bonsoir

    pourquoi l'incrémentation ne fonctionne pas dans ce cas?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int coucou = 3;
    coucou = (expression) ? coucou++ : coucou--;

  2. #2
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 59
    Points : 59
    Points
    59
    Par défaut
    Chez moi ça fonctionne très bien

    Edit: j'ai rien dit. Ca bug avec n'importe quel variable constante.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 94
    Points : 66
    Points
    66
    Par défaut
    el solutione :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int coucou=3;
    coucou = (expression) ? ++coucou : --coucou;

  4. #4
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Bien sur que ça fonctionne... Seulement l'opérateur suffixé renvoie une copie non incrémenté.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  5. #5
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 59
    Points : 59
    Points
    59
    Par défaut
    Mais alors, pourquoi dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        const bool a = true;
        int coucou = 3;
        coucou = ((a) ? (coucou++) : (coucou--));
    coucou devient 4 ? :p Quel différence entre une constante et une mutable dans ce cas ci ?
    C'est dû à une optimisation du compilo ?

  6. #6
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Avec ton code coucou vaut 3 hein.


    par contre avec :

    coucou = ((a) ? (++coucou) : (--coucou));

    coucou vaudra 4. Y'a pas d'histoire de constance ou non/

    Dans tout les cas, j'écrirais plutôt :

    a ? ++coucou : --coucou;

    ..
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  7. #7
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 59
    Points : 59
    Points
    59
    Par défaut
    Je t'assure que la valeur de coucou est différente si a est une constante ou non.
    C'est pas très logique par contre, je te l'accorde.

  8. #8
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    En effet autant pour moi j'avais mal compris ce que tu disais. Donc oui la selon si l'expression est constante ou pas ça change, mais j'avoue que je connais pas la raison.

    Fait plus étonnant j'ai ce comportement que sur gcc 4.3 et pas sur gcc 3.4.5 ... définitivement je capte pas.

    En gros si l'expression est non constante : le comportement est celui attendu. (enfin celui que moi je crois attendu), ie coucou vaut 3.
    Si l'expression testé dans la condition est constante alors coucou vaut 4 et je m'explique pas pourquoi.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 94
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par nuKs Voir le message
    Mais alors, pourquoi dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        const bool a = true;
        int coucou = 3;
        coucou = ((a) ? (coucou++) : (coucou--));
    coucou devient 4 ? :p Quel différence entre une constante et une mutable dans ce cas ci ?
    C'est dû à une optimisation du compilo ?
    je viens de tester ton bout de code le const ne change rien !

  10. #10
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 59
    Points : 59
    Points
    59
    Par défaut
    Pas de problème Goten.
    Je pense que c'est un bug interne à GCC peut-être dû à une optimisation mal foutue.
    Quel est la version de ton compilateur Elay ?

    "i686-apple-darwin9-gcc-4.0.1 (GCC) 4.0.1 (Apple Inc. build 5465)" dans mon cas.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 94
    Points : 66
    Points
    66
    Par défaut
    @ nuKs je suis sous visual studio 2008

  12. #12
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 59
    Points : 59
    Points
    59
    Par défaut
    Ok, ça confirme bien un bug.

    Je pense que GCC optimise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
         const bool a = true;
        int coucou = 3;
        coucou = ((a) ? (coucou++) : (coucou--));
        std::cout << coucou; // 4
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        int coucou = 3;
        coucou = coucou++;
        std::cout << coucou; // Toujours 4 :/
    Par contre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        int coucou = 3;
        int tmp = coucou++;
        coucou = tmp;
        std::cout << coucou; // 3 :)

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 94
    Points : 66
    Points
    66
    Par défaut
    même dans ton exemple je ne comprend pas le

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int temp = coucou++;
     // coucou est incremente mais n'est pas copié dans temp !

  14. #14
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 59
    Points : 59
    Points
    59
    Par défaut
    En fait, lors de cette ligne, temp doit être égale à coucou avant l'incrémentation, et coucou doit donc augmenter de valeur après.
    Tout fonctionne donc normalement pour cette ligne là. En fait la dernière portion de code que j'ai écrite était juste une manière détournée d'écrire coucou = coucou++;, mais le résultat aurait du être le même dans les deux cas (c'est à dire 3).

    Edit: Fait étonnant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        int x = 0, y = 0;
     
        if((x = x++) == (y = ++y)) {
            std::cout << "Etrangeté";
        } else {
            std::cout << "Normalité, mais..."; // 
            std::cout << "x" << x << " == y" << y; // x1 == y1
        }
    Retourne "Normalité, mais...x1 == y1". Donc la condition fonctionne comme si la valeur de x valait toujours 0, mais elle est tout de même incrémenté. En gros x vaut 0 mais x vaut 1

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 94
    Points : 66
    Points
    66
    Par défaut
    ah yes ça se tient !

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 94
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par nuKs Voir le message
    En fait, lors de cette ligne, temp doit être égale à coucou avant l'incrémentation, et coucou doit donc augmenter de valeur après.
    Tout fonctionne donc normalement pour cette ligne là. En fait la dernière portion de code que j'ai écrite était juste une manière détournée d'écrire coucou = coucou++;, mais le résultat aurait du être le même dans les deux cas (c'est à dire 3).

    Edit: Fait étonnant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        int x = 0, y = 0;
     
        if((x = x++) == (y = ++y)) {
            std::cout << "Etrangeté";
        } else {
            std::cout << "Normalité, mais..."; // 
            std::cout << "x" << x << " == y" << y; // x1 == y1
        }
    Retourne "Normalité, mais...x1 == y1". Donc la condition fonctionne comme si la valeur de x valait toujours 0, mais elle est tout de même incrémenté. En gros x vaut 0 mais x vaut 1
    d'abord tu copies dans x zero puis tu l'incrémentes et tu le copies dans x donc x vaut 1

    puis tu copie 0+1 dans y

    je ne vois pas ce qui est anormal

  17. #17
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 59
    Points : 59
    Points
    59
    Par défaut
    int x=0, y=0;

    (x = x++) => Doit retourner x, et x doit valoir 0.
    (y = ++y) => Doit retourner y, et y doit valoir 1.
    Dans l'expression du if, c'est bel et bien ce qui se passe, car (x=x++)==(y=++y) renvoi false sous mon compilo.
    Par contre, après cela x vaut 1, alors qu'il devrait toujours valoir 0.

    Donc en gros, à un moment donné, x vaut 0 et d'un coup il décide de devenir 1

  18. #18
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Vous avez jamais eu a surchargé l'op++ ? La version préfixé travaille sur l'objet. La version suffixé fait une copie, incrémente l'objet et renvoie la copie.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  19. #19
    screetch
    Invité(e)
    Par défaut
    c'est un comportement inféfini tout ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    yngwe@FRY:~$ gcc main.c -Wall -Wextra
    main.c: In function 'main':
    main.c:4: warning: operation on 'x' may be undefined
    http://en.wikipedia.org/wiki/Sequence_point

  20. #20
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 59
    Points : 59
    Points
    59
    Par défaut
    Ok, merci, le mystère est résolu.
    Je pensais que la priorité des opérateurs gérait ce genre de cas.
    Ma soif de connaissance est assouvie

    @Goten: regarde l'avant-dernier code que j'ai écris à la première page.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [GD] Pourquoi imagecreatefromjpeg ne fonctionne pas ?
    Par Woodgate dans le forum Bibliothèques et frameworks
    Réponses: 10
    Dernier message: 06/05/2008, 23h58
  2. pourquoi Form_BeforeUpdate ne fonctionne pas
    Par nima5 dans le forum IHM
    Réponses: 6
    Dernier message: 09/01/2008, 00h06
  3. Pourquoi CopyFile ne fonctionne pas !
    Par colorid dans le forum Débuter
    Réponses: 7
    Dernier message: 31/10/2007, 21h46
  4. Pourquoi somme() ne fonctionne pas ?
    Par pyxosledisciple dans le forum Access
    Réponses: 14
    Dernier message: 22/03/2006, 15h18
  5. Pourquoi AUTO_INCREMENT ne fonctionne pas ?
    Par Death83 dans le forum SQLite
    Réponses: 1
    Dernier message: 10/10/2005, 11h05

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