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 :

Syntaxe un peu caffouilleuse (Comma sep. inst) - Besoin d'expert


Sujet :

C

  1. #1
    Membre très actif
    Avatar de octal
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 441
    Par défaut Syntaxe un peu caffouilleuse (Comma sep. inst) - Besoin d'expert
    Bonjour,
    j'ai un pb avec une syntaxe un peu caffouilleuse du "C". C'est en relation avec les expressions séparées par des virgules (comma separated instructions).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    buf[i] ^= (cpk[i] = key[i]), cpk[16+i] = key[16 + i];
     
    // buf, key et cpk sont des tableau d'octets non signés (Unsigned Chars)
    // i est un unsigned char

    SVP, quelq'un pourrait-il me retranscrire cette instruction dans une syntaxe plus lisible (en plusieurs instructions simples bien sûr).

    Pour moi ce code serait équivalent à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    cpk[i] = key[i];
    buf[i] = buf[i] ^ key[i];
    cpk[16+i] = key[16 + i];
     
    // sachant bien sûr que les 3 lignes restent indivisibles pour préserver leur
    // effet de bords éventuel (ici yen a pas)
    Qu'en pensez vous?

    Cordialement

  2. #2
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Exact !

    Edit: je retire ce que j'ai dit :p

  3. #3
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Je préfère buf[i] ^= key[i]; au lieu de buf[i] = buf[i] ^ key[i];
    Pour le reste ça va.

  4. #4
    Membre très actif
    Avatar de octal
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 441
    Par défaut
    Citation Envoyé par Melem Voir le message
    Je préfère buf[i] ^= key[i]; au lieu de buf[i] = buf[i] ^ key[i];
    Pour le reste ça va.
    Merci pour votre aide.

    Oui en effet, je suis bien habitué aux opérateurs contracté (+= et autres). je voulais juste éclater l'écriture au maximum.

    Par contre j'aurais besoin d'une autre confirmation:

    Les instructions séparées par des virgules, sont elles considérés (en Ansi C) comme une seule instruction ? (ou bloc d'instruction)

    Je donne un exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for(i = 0; i < 10; i++) 
      k(i) ^= k(i-4),    // ***** Attention ici c'est une VIRGULE
      k(i+1) ^= k(i-3), // ***** Attention ici c'est une VIRGULE
      k(i+4) ^= k(i-2);
    Confirmez vous que les trois instructions separées par des virgules seront bel et bien exécutées 10 fois (comme une seule instruction) ?

    Cordialement et merci encore pour vos réponses rapides.

  5. #5
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Oui, qu'est-ce qui t'empêches d'essayer ?

  6. #6
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Tu trouveras également ici une présentation de ce qu'on appelle instruction en C.

  7. #7
    Membre très actif
    Avatar de octal
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 441
    Par défaut
    Merci pour votre aide. Pour info je fais du C depuis les années 1990 (principalement pour l'embarqué sur microcontrolleurs), et je voulais principalement des confirmations.

    Je trouve un peu bizarre que les "instructions" séparées par des virgules soient utilisées dans le corps des boucles. D'habitude (la syntaxe que l'on retrouve dans tt les livres) cette séparation par virgule n'est utilisée que dans l'entête des boucles (entre les parenthèses des boucles for notamment).

    C'est pour cela que je doute de ce genre de syntaxe (personnellement c'est la première fois que je le croise de cette manière là).

    Citation Envoyé par ssmario2 Voir le message
    Oui, qu'est-ce qui t'empêches d'essayer ?
    Pour une raison simple: C'est que je dois retranscrire un code en "C" vers un autre langage (d'où j'avais demandé l'équivalence en écriture complètement éclatée). Et c'est aussi pour cela que je demande si en "ANSI C" cela veux bien dire ce que je comprenais. Parce que le compilateur pour lequel le code avait été écris n'est pas complètement ANSI C et donc je voulais savoir si c'était une variation exotique de syntaxe du dit compilo ou est bien une vraie syntaxe ANSI C.

    Merci tout de même et bonne soirée

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Si on veut être plus précis, je pense que le code équivalent serait plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cpk[i] = key[i];
    buf[i] = buf[i] ^ cpk[i];
    cpk[16+i] = key[16 + i];
    Mais, dans ce contexte-là, ce n'est bien sûr qu'un détail, car cpk[i] == key[i].

    Si on avait eu (par exemple)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    buf[i] ^= (cpk[i] = key[i] + 1 ), cpk[16+i] = key[16 + i];
    ,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cpk[i] = key[i];
    buf[i] = buf[i] ^ key[i];
    cpk[16+i] = key[16 + i];
    aurait posé un problème.

  9. #9
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Non dans ce cas on aurait PAR EXEMPLE écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cpk[i] = key[i] + 1;
    buf[i] = buf[i] ^ (key[i] + 1);
    cpk[16+i] = key[16 + i];
    Qui est correct. Mais ce n'était pas le cas.

  10. #10
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    @jeroman :
    Mais, dans ce contexte-là, ce n'est bien sûr qu'un détail, car cpk[i] == key[i].
    Tu as raison, sauf que ce n'est pas un détail car rien ne dit que cpk[i] == key[i] :

    cpk[i] et key[i] ne sont pas nécessairement du même type. Par exemple, au hasard, key[i] int et cpk[i] unsigned char


    - Sur l'opérateur ',' :

    Dans l'expression exp1, exp2 , l'expression exp1 sera évaluée la première y compris dans ses effets de bords, avant d'évaluer exp2. La valeur et le type de l'expression sont ceux de exp2. C'est une des rares expressions dont l'ordre d'évaluation des opérandes est fixé. L'opérateur ',' est l'opérateur le moins prioritaire en C. On ne doit pas confondre cet opérateur avec la ',' qui sert de séparateur aux arguments d'une fonction.

  11. #11
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    de l'importance d'éviter l'obfuscation comme la peste

  12. #12
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    On ne doit pas confondre cet opérateur avec la ',' qui sert de séparateur aux arguments d'une fonction.
    J'ajoute sans rien contredire que si on veut utiliser l'opérateur virgule dans la liste des paramètres d'une fonction, il faut metrre les parenthèses. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%d\n", (a = 100, a + 1));

Discussions similaires

  1. Réponses: 3
    Dernier message: 08/11/2008, 16h45
  2. [AS] Besoin d'explication de syntaxe
    Par mdtdamien dans le forum Flash
    Réponses: 2
    Dernier message: 17/12/2005, 13h39
  3. Réponses: 4
    Dernier message: 04/12/2005, 15h33
  4. Besoin de la bonne syntaxe
    Par cscat dans le forum ASP
    Réponses: 4
    Dernier message: 16/10/2004, 16h16

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