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 :

3 question sur le "type BOOL" en C [FAQ]


Sujet :

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 3 question sur le "type BOOL" en C
    Bonjour.

    j'ai quelques questions sur le type BOOL en C.

    Question 1:
    Citation Envoyé par faq
    (..) il est très simple à 'créer' si le compilateur utilisé ne le propose pas déjà.

    #define TRUE 1
    #define FALSE 0
    typedef int BOOL;
    J'ai croisé récemment dans un code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef enum
    {
    FALSE,
    TRUE
    } BOOL;
    ça me semble identique à la proposition de la faq, mais j'ai peur de ne pas voir une subtilité. est-ce qu'il y a un cas ou l'utilisation des 2 types BOOL ci-dessus pourrait différer?

    Question 2: (edit: j'ai trouvé la réponse à cette question)
    Toujours dans un code que j'ai croisé:
    une fonction "MaFonction()" retourne un entier: soit 0, soit un nombre différent de 0 (mais pas forcément 1).
    le programme faisait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int returnValue;
    returnValue = MaFonction();
    //s'assurer que returnValue vaille 0 ou 1, et rien d'autre
    returnValue = !!returnValue;
    Et ça marche. Mais est-ce que cette méthode marche toujours? ou seulement sur le compilateur utilisé (visual C++ 6.0 en l'occurence)
    EDIT: réponse: oui, ça marchera toujours

    Question 3, et dernière:
    Citation Envoyé par faq
    La notation var1 && var2 correspond au test suivant : si var1 est vrai et que var2 est vrai, ..... alors que la notation var1 & var2 correspond au test suivant : si var1 contient le masque spécifié par var2, ....
    mais si j'ai:
    var1: 00101101
    var2: 00100010
    alors le var1 & var2 (c'est un "et" bit-à-bit, non?) retourne une valeur non nulle (un "true" si on veut) pourtant je n'ai pas l'impression que "var1 contienne le masque spécifié dans var2". A moins que je ne saisisse mal la notion de "contenir un masque"?

    merci de votre aide

    EDIT: question 2 résolue: voir ci-dessous

  2. #2
    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
    Je réponds moi même à ma 2eme question:
    OUI ça marchera toujours:
    opérateur négation (!)
    retourne une valeur comprise dans l'emsemble {0,1}
    avec:

    !exp =
    0 si exp != 0
    1 si exp == 0

  3. #3
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut Re: 3 question sur le "type BOOL" en C
    Citation Envoyé par Biosox
    Question 3, et dernière:
    Citation Envoyé par faq
    La notation var1 && var2 correspond au test suivant : si var1 est vrai et que var2 est vrai, ..... alors que la notation var1 & var2 correspond au test suivant : si var1 contient le masque spécifié par var2, ....
    mais si j'ai:
    var1: 00101101
    var2: 00100010
    alors le var1 & var2 (c'est un "et" bit-à-bit, non?) retourne une valeur non nulle (un "true" si on veut) pourtant je n'ai pas l'impression que "var1 contienne le masque spécifié dans var2". A moins que je ne saisisse mal la notion de "contenir un masque"?

    merci de votre aide
    var1 && var2 est un test qui est vrai dans le cas ou var1 et var2 sont tous deux differents de 0.
    C'est en fait une ecriture simplifiee de (var1 != 0) && (var2 != 0).

    var1 & var2 est un 'et' entre var1 et var2.
    Une de ses utilisations est la verification de la presence des bits de var2 dans var1, Mais ca ne verifie pas l'integralite du masque.

    Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    01011001 & 01000010 -> 01000000.
    En l'occurence, seul 1 bit de var2 est contenu dans var1. Mais le test sera vrai.
    Donc tu as raison. L'affirmation "la notation var1 & var2 correspond au test suivant : si var1 contient le masque spécifié par var2, ...." est incorrecte.

    Pour verifier que le masque de var2 est integralement contenu dans var1, le test est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if ((var1 & var2) == var2)
    Don't worry, be serious.
    La vie est courte. Prenez votre temps.

    Jack.

  4. #4
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut Re: 3 question sur le "type BOOL" en C
    Bonjour,

    Citation Envoyé par Biosox
    Question 1:
    Je prends

    entre ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #define TRUE 1
    #define FALSE 0
    typedef int BOOL;
    et ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef enum
    {
    FALSE,
    TRUE
    } BOOL;
    Il n'y a pas de différence à l'utilisation :
    Par contre il faut faire attention car la norme C99 définie un type booléan. Au niveau du compilateur il s'agit du type _Bool qui peut prendre les valeurs 0 et 1. Ceci pour des raisons de compatibilité avec les anciennes sources où il n'est pas rare que les programmeurs aient déjà défini un type Bool, bool ou encore BOOL. Comme les noms commençant par un underscore suivie d'une lettre ou d'un underscore sont réservés par la norme [si tout le monde respecte la norme], il n'y a pas de problème.
    Par dessus ceci, vient le fichier stdbool.h qui défini les macro (le fait que ça soit des macro est imposé par la norme) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #define TRUE 1
    #define FALSE 0
    #define bool _Bool
    #define __bool_true_false_are_defined
    Donc pour implémenter correctement un type booléan en respectant la norme C90 et C99 il faut écrire quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef __bool_true_false_are_defined
    #  define TRUE 1
    #  define FALSE 0
    #  define bool int
    #  define __bool_true_false_are_defined
    #endif

  5. #5
    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
    Et bien merci beaucoup pour ces réponses.

    Il est complètement fou ce forum! C'est vrai quoi, c'est fou! je pose une question longue de 3 kilomètre, en pensant que personne ne la lira jusqu'au bout, et 20 minutes plus tard je reviens, 2 personnes ont répondu.

    Et, attention madame! pas de réponses du style "achète-toi un bouquin de C", non madame. Des réponses tellement claires et complètes que les éditeurs de bouquins de C peuvent aller se mettre au chômage, attention!

    alors moi je dis MERCI!


    EDIT: euh. peut etre que quelqu'un devrait faire une petite modif dans la faq?

  6. #6
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par Biosox
    Des réponses tellement claires et complètes que les éditeurs de bouquins de C peuvent aller se mettre au chômage, attention!
    Merci Euh nan il en reste au moins un : Achille Braquelaire qui m'a appris (grâce à son livre) celà, et plein d'autre choses !

    Citation Envoyé par Biosox
    EDIT: euh. peut etre que quelqu'un devrait faire une petite modif dans la faq?
    Oui c'est aussi pour cela que je me suis appliqué

  7. #7
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut
    Citation Envoyé par Biosox
    Et, attention madame! pas de réponses du style "achète-toi un bouquin de C",
    Achetes toi un bouquin de C quand meme ca sert toujours
    Don't worry, be serious.
    La vie est courte. Prenez votre temps.

    Jack.

  8. #8
    Membre émérite

    Homme Profil pro
    Inscrit en
    Juillet 2003
    Messages
    2 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 2 075
    Points : 2 844
    Points
    2 844
    Par défaut
    Citation Envoyé par Jack_serious
    Citation Envoyé par Biosox
    Et, attention madame! pas de réponses du style "achète-toi un bouquin de C",
    Achetes toi un bouquin de C quand meme ca sert toujours
    La preuve c'est là que gege a appris ce genre de trucs merci qui?

  9. #9
    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 Re: 3 question sur le "type BOOL" en C
    Citation Envoyé par Biosox
    j'ai quelques questions sur le type BOOL en C.
    N'existe pas et de plus est totalement inutile. Une expression logique C retourne 0 ou 1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    printf ("%d\n", 2 < 1);
    printf ("%d\n", -1 == 2 - 3);
    Pas de Wi-Fi à la maison : CPL

  10. #10
    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 Re: 3 question sur le "type BOOL" en C
    Citation Envoyé par Emmanuel Delahaye
    N'existe pas
    ça c'est clair. Ma question portait plutot sur la "façon de le créer" (voir question 1 en particulier.)

    Citation Envoyé par Emmanuel Delahaye
    et de plus est totalement inutile.
    C'est une question de point de vue. Pour ma part, je pense que "on peut facilement s'en passer" n'implique pas "c'est totalement inutile" (qu'on parle de type BOOL en C ou d'autre chose.

    Citation Envoyé par Emmanuel Delahaye
    Une expression logique C retourne 0 ou 1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    printf ("%d\n", 2 < 1);
    printf ("%d\n", -1 == 2 - 3);
    Merci beaucoup pour ces précisions. J'avoue qu'il y avait pour moi une confusion: si je fais un test if(a) ou a est un entier non nul (mais pas forcément 1), le test "passe". du coup j'avais peur qu'une expression logique C retourne 0 ou "un entier non nul indéfini".

    Je pense qu'il reste à modifier la faq, plus précisément le point
    http://c.developpez.com/faq/c/?page=...Unaire_Binaire
    si tout le monde est d'accord avec la réponse de Jack_Serious.


    Citation Envoyé par Jack_serious
    Achetes toi un bouquin de C quand meme ca sert toujours
    Je vous rassure tous (surtout Gnux: responsables livres), j'ai un bouquin de C! c'est la "bible du programmeur C/C++". Mais je suis en déplacement en ce moment, et ce bouquin prend à lui seul la moitié du volume de ma valise. Donc je l'ai laissé bien au chaud à la maison

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

Discussions similaires

  1. question sur champ de type "identity"
    Par iceman2001 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/05/2009, 17h02
  2. Question sur le type bool
    Par gentox dans le forum C
    Réponses: 3
    Dernier message: 05/12/2005, 18h55

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