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 :

Parenthèse qui perturbe un calcul d'expression constante


Sujet :

C++

  1. #1
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut Parenthèse qui perturbe un calcul d'expression constante
    EDIT: oubliez, j'ai trouvé mon erreur.


    Bonjour,

    Voulant adapter un Bit Twiddling Hack en fonction constexpr, je suis tombé sur quelque chose qui me perturbe assez.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    static_assert(8|(8>>1)|(8>>2)|(8>>4)|(8>>8) == 15, "succes normal");
    static_assert((8|(8>>1)|(8>>2)|(8>>4)|(8>>8)) == 14, "succes anormal");
    static_assert(1+(8|(8>>1)|(8>>2)|(8>>4)|(8>>8)) == 16, "WTF?");
    Avec GCC 4.6.3 et clang 3.5, le premier calcul me donne le bon résultat. Le second, avec la parenthèse en plus, me fait perdre 1 au résultat, et du coup, le dernier foire totalement.

    Est-ce moi qui ne suit pas réveillé, ou assistons-nous à un bug de 2 compilos ?

    EDIT: c'est la même chose avec les divers compilos (VC++, clang, icc, gcc) que j'ai pu essayer en ligne. Au détail qu'ils me trouvent un soucis de précédence dans les priorités de | sur la seconde ligne. Cela n'explique pas le dernier résultat, même sur-parenthésé, qui vaut tout le temps 15.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  2. #2
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Un soucis de précédence sur la première ligne, non ?
    (Il y a moyen d'avoir se genre d'info de gcc avec -Wparentheses.)

    Mais == est prioritaire sur |, donc (8>>4)|(8>>8) == 15 est équivalent à (8>>4)|((8>>8) == 15) => (8>>4)|0 => 0x0.
    Ceci fait que le premier résultat est un entier et les 2 suivants des booléens.

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

Discussions similaires

  1. probleme avec un programme en JS qui realise des calculs
    Par leclone dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 17/09/2006, 19h09
  2. Réponses: 3
    Dernier message: 30/08/2006, 22h30
  3. Réponses: 7
    Dernier message: 05/07/2005, 17h50
  4. calcul d'expression
    Par k_boy dans le forum Bases de données
    Réponses: 3
    Dernier message: 29/06/2004, 23h07
  5. [D7-EXCEL2000] Formule dans cellule Excel qui ne se calcule pas
    Par Albertolino dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 09/09/2003, 15h18

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