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

Réseau C Discussion :

Opérateur virgule


Sujet :

Réseau C

  1. #1
    Membre actif Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Points : 203
    Points
    203
    Par défaut Opérateur virgule
    Bonjour.

    Dans son tutorial sur les socket, Emmanuel Delahaye (que je remercie au passage pour ce tutorial) a ecrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sock_err = closesocket (sock), sock = INVALID_SOCKET;
    intrigué par cette virgule, je trouve dans un cours:
    Opération : évaluation en séquence. Format :
    exp1 , exp2
    exp1 et exp2 sont quelconques. L'évaluation de exp1 , exp2 consiste en l'évaluation de exp1 suivie de l'évaluation
    de exp2. L'expression exp1 , exp2 possède le type et la valeur de exp2 ; le résultat de l'évaluation de exp1 est
    oublié , mais non son éventuel effet de bord (cet opérateur n'est utile que si exp1 a un effet de bord).
    Mais je comprend mal cette explication. En fait je comprend mal la notion d'effet de bord, du coup, je comprend mal en quoi cet opérateur peut être utile.
    J'aurai tendance à mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ock_err = closesocket (sock);
    sock = INVALID_SOCKET;
    Quelle différence?
    Quelqu'un peut eclairer ma lanterne?
    Merci!

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Salut !

    La ligne que tu as écrite est effectivement équivalente à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sock_err = closesocket (sock);
    sock = INVALID_SOCKET;
    il s'agit simplement d'une notation "simplifiée" (pas toujours) pour écrire certaines expressions

    un exemple célèbre pour montrer l'effet de bord est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int i = 0, j, k, l, m;
    j = i;
    k = i++;
    m = i + 1;
    l = ++i;
    à la fin du code, j et k vallent 0, tandis que m, l et i vallent 2.

    les expressions 'i' et 'i++' VALLENT la même valeur (celle de i)
    cependant, i++ a pour effet de bord d'incrémenter i
    de même '++i' et 'i + 1' ont la même valeur (celle de i+1)
    mais '++i' a pour effet de bord d'incrémenter i tout comme 'i++'
    'i++' et '++i' ont le même effet de bord (incrémentation de i) mais pas la même valeur.

    en C une expression a toujours 4 caractéristiques :
    un type (éventuellement void)
    une valeur (éventuellement sans information (cas d'une valeur de type void))
    une adresse (éventuellement non récupérable (cas d'un retour par copie))
    et éventuellement des effets de bords

    pour l'adresse est irrécupérable (il me semble), la valeur est celle de i, le type celui de i et l'effet de bord est que la valeur de j vaut celle de i

    pour l'adresse est irrécupérable (il me semble), la valeur est celle de i avant l'exécution de l'expression, le type celui de i et l'effet de bord est que la valeur de k vaut celle de i avant l'exécution de l'expression et que i est incrémentée

    pour l'adresse est irrécupérable (il me semble), la valeur est celle de i avant l'exécution, le type celui de i et l'effet de bord est que i est incrémentée

    pour l'adresse est irrécupérable (il me semble), la valeur est celle de i+1, le type celui de i et l'effet de bord est que la valeur de m vaut celle de i + 1

    pour l'adresse est irrécupérable, la valeur est celle de i+1, le type celui de i et il n'y a pas d'effet de bord

    pour l'adresse est irrécupérable (il me semble), la valeur est celle de i + 1 avant l'exécution de l'expression, le type celui de i et l'effet de bord est que la valeur de k vaut celle de i + 1 avant l'exécution de l'expression et que i est incrémentée

    pour l'adresse est irrécupérable (il me semble), la valeur est celle de i + 1 avant l'exécution, le type celui de i et l'effet de bord est que i est incrémentée


    J'espère que ces exemples t'ont permis de mieux comprendre ce qu'étaient les effets de bords

  3. #3
    Membre actif Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Points : 203
    Points
    203
    Par défaut
    Merci pour ces explications, professeur!

    Je pense comprendre la notion d'"effet de bord", et du coup l'interet que pourrait avoir l'opérateur virgule.

    Par exemple, si je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        int i,j,k;
        i=2;
        j=3;
        k=(i++, j+2);
    A la fin, j'ai bel et bien k=5 (expr 2: j+2) l'expr 1 a été oubliée comme prévu, mais pas son "effet de bord": i vaut 3

    Donc il semble qu'en effet, dans le cas du tuto d'Emmanuel Delahaye, on aurait pu mettre ; à la place de , ça aurait strictement rien changé!

    Merci encore pour ces explications!

  4. #4
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    [edit]*SNIP*[/edit]
    si tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        int i,j,k;
        i=2;
        j=3;
        k=i++; j+2;
    k vaudra 2 et c'est le résultat de j+2 qui sera "oublié"

  5. #5
    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
    Citation Envoyé par Biosox
    Dans son tutorial sur les socket, Emmanuel Delahaye (que je remercie au passage pour ce tutorial) a ecrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sock_err = closesocket (sock), sock = INVALID_SOCKET;
    intrigué par cette virgule, je trouve dans un cours:
    <...>
    J'aurai tendance à mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sock_err = closesocket (sock);
    sock = INVALID_SOCKET;
    Sur le plan fonctionnel, c'est identique. Mais j'ai mis la virgule pour une raison 'tactique'.

    Quand on ecrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    statement_a;
    statement_b;
    il est facile d'insérer une instruction entre les deux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    statement_a;
    statement_x;
    statement_b;
    Un peu trop facile à mon gout, surtout quand j'ai envie que les deux instructions soient 'indissociables'.
    J'aurais pu écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    statement_a;statement_b;
    Mais le premier indenteur venu m'aurais remis tout ça sur 2 lignes...
    Avec ce codage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    statement_a,statement_b;
    le code resiste à l'indenteur, et de plus, pour insérer du code entre les deux, ...il faut le vouloir...

  6. #6
    Membre actif Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Points : 203
    Points
    203
    Par défaut
    @Emmanuel:
    Merci pour ces précisions

    @Swoog:
    Et pourtant, k vaut 5.

  7. #7
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Citation Envoyé par Biosox
    @Swoog:
    Et pourtant, k vaut 5.
    oui, c'est bien ce que je voulais dire :
    et ne sont pas équivalents
    c'est et qui le sont

    enfin, dans le cas présent, ça serait plutôt :
    et

+ 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 Patrick6 dans le forum C
    Réponses: 5
    Dernier message: 23/12/2004, 13h11
  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