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 :

Que signifie cette syntaxe ?


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Par défaut Que signifie cette syntaxe ?
    Bonjour tout le monde,

    Je suis tombé sur une erreur de syntaxe dans une portion de code de mon projet. Après vérification à l'aide de ma gestion de conf, il s'avère que le développeur a simplement introduit "une erreur" par faute de frappe. L'appel a une fonction a tout simplement était changé pour passer de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    unsigned long loc_ul_result = Fonction_Toto( arg1, arg2, &arg3) ;
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    unsigned long loc_ul_result = *( arg1, arg2, &arg3) ;
    Bon, il s'agit d'une faute de frappe certes, mais qui passe à la compilation sans erreur ni warning, et qui a pour but de toujours renvoyer NULL.

    Que signifie cette syntaxe barbare ?
    On utilise Visual C++ 6 pour ce projet, est-ce une abération du compilateur, est-ce que sous GCC ca compilerait ?

    Est-ce un pointeur sur une fonction toujours nulle (jamais déclarée) donc utilisée certes mais lorsque l'on déréférence cette fonction à l'aide de "*" ça nous renvoie l'adresse mémoire 0x00000000 d'une fonction soit NULL ?

    Cette question est juste par simple curiosité de développeur C++ (d'ailleurs, pour le coup, c'est du C, pas du C++ !), sachant que le problème a bien été résolu (la portion de code sous jacente au retour n'était jamais prise en compte !).

    Merci a vous.
    Alex.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Il me semble que cela se résoud en "unsigned long loc_ul_result = arg3;"
    Ne pas oublier que la virgule est un séparateur d'expression, on a donc:
    • (arg1, arg2, &arg3) qui évalue arg1 et arg2 et retourne &arg3
    • *(&arg3) qui retourne arg3.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Par défaut
    Merci,

    mais si cela revenait à "unsigned long loc_ul_result = arg3;", alors je n'aurais jamais en retour 0x00000000 comme là. J'aurais la valeur de arg3, qui lui est bien initialisé, a moins que tu ne veuilles dire que arg3 prends la valeur de l'expression des deux précédents arguments, mais alors quoi ? Par quelle opération logique sont évalués arg1 et arg2 ?

    arg3 = arg1 && arg2 ?

    Merci pour votre aide.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Non, pas d'opération compliqué. Si c'est ce que je pense, la valeur aurait bien dû être celle de arg3, qui n'aurait pas été modifié par cette ligne.

    Je peux aussi m'être trompé, mais es-tu sûr que c'est bien arg3 qui est initialisé à une valeur non-nulle, et non pas juste &arg3 ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Je peux aussi m'être trompé
    Non, le raisonnement est correct.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int c1 = 1, c2 = 2, c3 = 3;
    int x = *(c1, c2, &c3);
    x vaut bien 3.

  6. #6
    Membre confirmé
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Par défaut
    Merci pour votre aide. J'ai fait ce meme test au meme moment, effectivement les arguments avant le dernier argument sont évalués sans conséquence !

    Ce qui m'avait induit en erreur c'était que le dernier arguement était toujours initialisé à 0 (evidemment !), donc casté en false pour l'évaluation de mon code de retour !

    D'ailleurs, pour simplifier,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int c1 = 1, c2 = 2, c3 = 3;
    int x = (c1, c2, c3);
    fait la meme chose.
    D'ou ma question, a quoi peut bien servir cette syntaxe prévu dans le C ? En trouve t on un exemple concret, ou c'est une subtilité du compilateur (un effet de bord...) juste pour le fun ?
    De plus, ca marche sous GCC aussi ?
    Pourquoi les createurs du langage ont ils prévu un tel cas, qui ne sert a rien apparemment ?

    Merci.

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    C'est sympa pour mettre un truc du genre:
    En une seule instruction. Si tu mets ça derrière un if() sans accolade, les deux seront toujours exécutées, ou aucune.
    Vachement utile si on commence à faire des macros, les fonctions inline n'étant disponibles en standard que depuis C99...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre expérimenté
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Par défaut
    Citation Envoyé par Médinoc
    C'est sympa pour mettre un truc du genre:
    En une seule instruction. Si tu mets ça derrière un if() sans accolade, les deux seront toujours exécutées, ou aucune.
    AMHA, Si l'opérateur , est comme l'opérateur + (ce que je crois est le cas) ce serait une très mauvais idée.
    On ne modifie pas deux fois une variable entre deux "sequence point"

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Il me semble que l'ordre d'évaluation est garanti quand il s'agit de deux expressions l'une après l'autre (et non pas d'un appel de fonction). Il faudrait demander à Emmanuel du forum C...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre confirmé
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Par défaut
    Merci a vous tous pour ces réponses. A bientot.

  11. #11
    Membre expérimenté
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Par défaut
    Citation Envoyé par Médinoc
    Il me semble que l'ordre d'évaluation est garanti quand il s'agit de deux expressions l'une après l'autre (et non pas d'un appel de fonction). Il faudrait demander à Emmanuel du forum C...
    Hum, voilà déjà ça.

    [URL="http://en.wikipedia.org/wiki/Sequence_point"]

    Honnêtement comme, j'ai toujours un peu de mal à expliquer les "sequence point"
    Je n'ai jamais fait l'effort... je me contente d'éviter de modifier la même variable entre deux sequence points.
    ce qui n'est pas pareil que l'ordre d'évaluation qui est lui garanti en effet (enfin, je serais d'accord sur ce point)

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

Discussions similaires

  1. Que signifie cette syntaxe ?
    Par Triste dans le forum Débuter
    Réponses: 4
    Dernier message: 08/11/2007, 15h00
  2. Que signifie cette syntaxe de code ?
    Par SPACHFR dans le forum C
    Réponses: 4
    Dernier message: 02/05/2007, 13h24
  3. Que signifie cette erreur de compilation ?
    Par Premium dans le forum C
    Réponses: 14
    Dernier message: 22/05/2006, 23h16
  4. [SQL-Server] 'Bad column offset' que signifie cette erreur ?
    Par dor_boucle dans le forum PHP & Base de données
    Réponses: 20
    Dernier message: 08/02/2006, 15h01
  5. [SQL][DERBY] Que signifie cette erreur ?
    Par irenee dans le forum Langage SQL
    Réponses: 4
    Dernier message: 19/12/2005, 14h34

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