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 :

Opérateur virgule


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2004
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 8
    Points : 10
    Points
    10
    Par défaut Opérateur virgule
    Hello everybody.

    Ma question a trait à l'opérateur virgule, qui permet de relier des expressions en assurant leur éxécution de gauche à droite, pour rendre comme valeur le résultat de l'expression la plus à droite.

    1) L'opérateur virgule est une opérateur, il rend une valeur: cela est conforme à la définition d'une expression. L'ensemble des expressions reliées par l'opérateur virgule est donc lui-même une expression.

    2) K&G nous explique [K&G $A7.18 page 210] que tous les effets de bords d'une expression sont réalisés avant de passer à l'expression située à droite dans le cours des éxécutions d'expressions de l'opérateur virgule.

    3) La définition de l'opérateur ++ nous dit: postfixé ==> incrémentation après avoir rendu la valeur dans l'expression, préfixé ==> incrémentation avant de rendre la valeur dans l'expression.

    Donc, comment se fait-il que les deux codes:

    int n=0, x=2; ++x, n=x<3;

    et

    int n=0, x=2; x++, n=x<3;

    donnent strictement le même résultat, à savoir la valeur zéro pour n?

    Normalement, dans le deuxième cas, x aurait du être incrémenté APRES l'expression, et on devrait donc avoir la valeur 1 pour n.

    Et schtroumph.

    Merci pour toute réponse.

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Si je ne me trompe pas, le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int n=0, x=2; ++x, n=x<3;
    correspond à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int n=0;
    int x=2;
    ++x;
    n=x<3;
    Donc que l'opérateur ++ soit préfixé ou postfixé ne change rien...

    a++

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,

    adiGuba +1

    2) K&G nous explique [K&G $A7.18 page 210] que tous les effets de bords d'une expression sont réalisés avant de passer à l'expression située à droite dans le cours des éxécutions d'expressions de l'opérateur virgule.
    signifie très clairement:

    L'expression à gauche de la virgule est entièrement exécutée avant de passer à l'expression à droite
    (C'est la seule manière de garantir que tous les effets de bord sont réalisés.)
    Compilation sans erreur ne signifie pas programme sans erreur.
    L'indentation n'a pas été imaginée pour faire beau, mais pour faciliter la lecture des programmes.

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Opérateur virgule
    Citation Envoyé par Patrick6
    Donc, comment se fait-il que les deux codes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int n=0, x=2; ++x, n=x<3;
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int n=0, x=2; x++, n=x<3;
    donnent strictement le même résultat, à savoir la valeur zéro pour n?
    L'opérateur virgule introduit un 'point de séquencement' (sequence point) explicite, qui garanti l'ordre (gauche à droite) et l'exécution complète du code entre les ','.

    ++x et x++ pris isoléments (entre des ',') ont le même comportement.
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Exactement, l'opérateur comma garantit une évaluation complête de chaque expression avant l'évaluation de l'expression suivante à sa droite.

    Donc ici,
    donne
    incrementer x puis évaluer (n=x<3), le résultat est 1 car n=3<3 est vrai.
    encore une fois
    signifie
    incrementer x puis évaluer (n=x<3), le résultat est 1 car n=3<3 est vrai.

    Ces deux lignes sont strictement équivalentes en terme de résultat.
    Par contre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int n=0, x=2,z;
    int m=0, y=2,w;
     
    z=(++x), (n=z)<3;
    w=(y++), (m=w)<3;
     
    printf("N:%d , X:%d Z:%d\n",n,x,z);
    printf("M:%d , Y:%d Z:%d\n",m,y,z);
    ici en imprimant à l'écran y,x et n, tu verras une différence.

  6. #6
    Membre à l'essai
    Inscrit en
    Décembre 2004
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 8
    Points : 10
    Points
    10
    Par défaut Opérateur virgule
    Juste merci pour toutes ces réponses.


    Le sens du réel vient de la démarche même que l'on fait à son encontre (E. Mounier)

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

Discussions similaires

  1. Opérateur , (virgule) et ordonnancement.
    Par Agoudard dans le forum Langage
    Réponses: 8
    Dernier message: 12/09/2012, 13h25
  2. Opérateurs virgule fixe en Simulink
    Par silio dans le forum Simulink
    Réponses: 0
    Dernier message: 18/06/2012, 10h45
  3. Opérateur virgule
    Par sami2008 dans le forum Langage
    Réponses: 3
    Dernier message: 12/09/2009, 12h03
  4. Opérateur virgule
    Par Biosox dans le forum Réseau
    Réponses: 6
    Dernier message: 20/05/2006, 23h30
  5. Chiffre a Virgule Fixe
    Par garybaldi dans le forum C
    Réponses: 3
    Dernier message: 21/06/2002, 10h41

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