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 régulier
    Inscrit en
    Décembre 2004
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 8
    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
    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
    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 émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    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.)

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    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.

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    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 régulier
    Inscrit en
    Décembre 2004
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 8
    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