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 :

[Explication] ~bool warning C4804


Sujet :

C++

  1. #1
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut [Explication] ~bool warning C4804
    Bonjour à tous,

    Je me présente ici pour demander un petit renseignement sans doute anodin mais qui m'agace de ne pas savoir pourquoi
    Si je compile ça sous Visual Studio 2008 Express.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    struct myStruct
    {
        bool m_myBool;
    };
     
    int main()
    {
        m_myBool = ~m_myBool;
    }
    J'ai le droit a deux warnings
    warning C4804: '~' : unsafe use of type 'bool' in operation
    warning C4800: 'int' : forcing value to bool 'true' or 'false' (performance warning)

    Alors pourquoi? le bitwise n'est pas sur? Est ce une question de BigEndian et LittleEndian qui ferait que ce ne sera pas sur sur toute les machines?

    Ou bien d'autre raison pour me dire ça.

    Merci
    Homer J. Simpson


  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Je ne comprend pas bien l'intérêt d'utiliser sur un booléen l'opérateur ~...
    Que veux-tu faire ? Une inversion du booléen ?

  3. #3
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Oui, c'est le but.
    Je dis pas que c'est une volonté absolue de ma part, mais je demande juste pourquoi il me lance ce warning sur un bool
    Homer J. Simpson


  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Sans doute parce que l'opérateur ~ doit s'appliquer à un nombre, et pas à un booléen.

    Utilise l'opérateur !.

  5. #5
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Merci, je sais que je peux utiliser le ! mais ~ est fait aussi pour ça.
    L'un et l'autre on leur raison d'être différente et s'applique sur un booléen.

    C'est un warning pas une erreur donc ça s'applique a un boolean, de plus un bool est codé sur 32bits comme un int sauf certaines architecture sur 1 bits. Donc c'est applicable.
    Je demande une explication, pas une solution.

    merci quand même
    Homer J. Simpson


  6. #6
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par Astraya Voir le message
    Merci, je sais que je peux utiliser le ! mais ~ est fait aussi pour ça.
    L'un et l'autre on leur raison d'être différente et s'applique sur un booléen.

    C'est un warning pas une erreur donc ça s'applique a un boolean, de plus un bool est codé sur 32bits comme un int sauf certaines architecture sur 1 bits. Donc c'est applicable.
    Je demande une explication, pas une solution.

    merci quand même
    Non, le ~ n'est pas fait pour ça. ~ est fait pour obtenir le complément à 1 d'un scalaire, ce qui n'a pas de sens pour un booléen, de la même manière que | et & n'ont pas de sens sur un booléen (true & 0x100, ça donne quoi ?). Ainsi, ~false ne va pas nécessairement donner true comme valeur et ~true ne va pas nécessairement donner false.

    Si true = 0x00000001, alors ~true = 0xFFFFFFFE != false (0), et ~false = 0xFFFFFFFF != true (0x00000001).

    Bien sûr, le principe de mondre surprise prévaut dans le standard, et il est logique que ~true = false et ~false = true. Cependant, pour pouvoir effectuer correctement ces opérations, et selon l'implémentation choisie par le vendeur de compilateur, des tests supplémentaires implicites sont peut-être nécessaire (c'est certainement ce qui se passe avec Visual C++).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // pseudo code pour x = ~y lorsque x et y sont de type bool
    x = ((~(int)y) ? true : false)
    Au niveau code machine, ça s'implémente nécessairement en plusieurs instructions machines là ou une seule est normalement nécessaire - d'où le performance warning.

    ! est utilisé pour effectuer une négation logique: !0 == true, et !n == false pour n != 0, et ce pour tous les types intégraux (avec promotion vers le type booléen si nécessaire).

    Pour plus de précision :

    Citation Envoyé par n3242, 5.3.1
    9) The operand of the logical negation operator ! is contextually converted to bool (Clause 4); its value is true if the converted operand is false and false otherwise. The type of the result is bool.

    10) The operand of ˜ shall have integral or unscoped enumeration type; the result is the one’s complement of its operand. Integral promotions are performed. The type of the result is the type of the promoted operand. There is an ambiguity in the unary-expression ˜X(), where X is a class-name or decltype-specifier. The ambiguity is resolved in favor of treating ˜ as a unary complement rather than treating ˜X as referring to a destructor.
    Je tiens à rajouter que rien ne te dis que les bool soient codés sur 32 bits. sizeof(bool) n'est pas défini dans le standard C++.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  7. #7
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    OK!
    Merci pour cette précision. Exactement ce que je demandais!
    Merci
    Homer J. Simpson


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

Discussions similaires

  1. Réponses: 3
    Dernier message: 04/03/2014, 12h16
  2. warning C4800 :Conversion forcée de char* en bool!
    Par bertry dans le forum C++/CLI
    Réponses: 3
    Dernier message: 31/12/2010, 11h20
  3. [RegEx] explication warning "REG_EPAREN"
    Par mzt.insat dans le forum Langage
    Réponses: 1
    Dernier message: 22/02/2007, 17h17
  4. Réponses: 8
    Dernier message: 01/03/2005, 22h41
  5. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 22h18

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