2011-04-14 4 views
17

Dans de nombreux programmes, je vois des instructions avec les identifiants FALSE et false. Y a-t-il une différence entre eux dans le contexte de C++? Dans certains programmes, j'ai vu bool et quelque part BOOL. Quelle est la différence entre les deux? Est-ce que quelqu'un peut expliquer la différence entre ces identifiants pour moi? Merci.Quelle est la différence entre false et FALSE?

+0

Est-ce sous Windows? Puis c'est un reste d'un temps C quand il n'avait pas de réels booléens et FALSE a été défini à 0. – RedX

+0

@RedX: vous voulez dire que FALSE est défini par des booléens alors qu'en est-il de faux? – RidaSana

+0

Non, 'FALSE' a été défini comme ceci:' #define FALSE (0) ' –

Répondre

22

Si vous avez inclus windows.h, puis FALSE est #defined 0. TRUE est #defined comme 1. Il est pas un type booléen, il est un type entier. Windows a également défini le type BOOL, qui est en fait un type entier conçu pour accueillir les valeurs TRUE et FALSE.

Les sections pertinentes de code à windows.h ressembler à quelque chose comme ceci:

#ifdef FALSE 
#undef FALSE 
#endif 
#define FALSE 0 

#ifdef TRUE 
#undef TRUE 
#endif 
#define TRUE 1 

typedef int BOOL, *PBOOL, *LPBOOL; 

Windows a été écrit en C, tout comme toutes les applications Windows d'origine. À ce moment-là, C n'avait pas de type booléen défini par la norme. Au lieu de cela, les développeurs ont été forcés de définir leurs propres constantes booléennes. Pour éviter le désordre qui pourrait causer, Microsoft a décidé d'une norme qui serait utilisée pour toutes les applications Windows.Si vous écrivez des applications Windows, vous devrez peut-être utiliser les identificateurs TRUE et FALSE. Plusieurs des fonctions définies dans windows.h acceptent des paramètres booléens (en réalité des entiers!) Typés BOOL ou renvoient des valeurs de ce type. C++, étant fortement typé, peut se plaindre si vous le contractez au type booléen défini dans la norme du langage. Par souci de cohérence, j'utilise les anciens identifiants dans tous mes appels aux fonctions de l'API Windows, et les mots-clés true et false maintenant définis par le standard dans toutes les méthodes que j'écris moi-même.

Il n'y a vraiment aucune raison de ne pas utiliser FALSE tel qu'il est défini dans windows.h. Mais vous ne devriez pas le définir vous-même dans un fichier d'en-tête propriétaire, comme d'autres l'ont mentionné, car il n'y a aucune garantie que la définition restera constante au fil du temps. Cela pourrait causer des bogues assez stupides, le type qui peut apparaître sur le Daily WTF.

Mat's answer est 100% correct que ni TRUE ou FALSE sont définis par les normes C ou C++. Cependant, ils sont strictement définis par l'API Windows et garantis de ne pas changer. Les utiliser ne produira pas vraiment de code C++ conforme à la multiplicité des plateformes et strictement conforme aux normes, mais cela est rarement un problème lors de l'écriture d'applications Windows, car aucune des autres fonctions ne sera appelée dans windows.h.

+0

@cody: oui j'utilise l'application fenêtre ... donc j'utilise FAUX et VRAI .. son fonctionnement avec le type booléen ... – RidaSana

+0

@Cody : qu'en est-il de la deuxième partie de la question sur bool et BOOL? – RidaSana

+1

@Miss: J'ai ajouté cela dans une mise à jour à ma réponse. Succinctement, 'bool' est le type booléen défini dans la norme C++. Il fonctionne avec les mots-clés 'true' et' false'. 'BOOL' est un type entier, défini par' windows.h', conçu pour fonctionner avec les 'TRUE' et 'FALSE'. Facile à retenir, car les cas correspondent pour chaque groupe. –

13

FALSE n'est pas défini dans la norme. Seulement false est. true et false sont appelés "littéraux booléens" (et sont des mots-clés en C++). est parfois défini comme une macro. Vous ne pouvez pas compter sur sa présence dans un environnement conforme aux normes, car cela ne fait pas partie de la norme.

En d'autres termes, le programme suivant est valide C++:

#include <iostream> 

#define FALSE 1 

int main() 
{ 
    bool a = false; 
    bool b = FALSE; 
    std::cout << a << " " << b << std::endl; 
    return 0; 
} 

et imprimera 0 1 comme prévu. FALSE n'est en aucun cas un symbole privilégié.

+0

mais FAUX et faux retour 0 .. cela signifie que les deux types sont bool .. droite – RidaSana

+2

pas en C++ standard. 'TRUE' et' FALSE' peuvent être définis (généralement comme une macro, parfois comme une valeur 'enum'), mais vous ne pouvez pas compter dessus. Avec 'GCC' sous Linux par exemple,' bool something = FALSE; 'est une erreur de compilation car' FALSE' n'est pas défini. Quand 'FALSE' est défini, il sera généralement défini comme' 0' ou 'false' - mais ce n'est pas quelque chose sur quoi vous devriez compter. S'appuyer sur les normes. – Mat

+0

qu'en est-il de la deuxième partie de la question sur bool et BOOL? – RidaSana

1

false est un mot clé C++.

FAUX n'est pas défini par la norme C++. Mais la plupart des compilateurs ont FAUX défini comme une macro préprocesseur avec la valeur 0.

+0

vous voulez dire qu'il est déjà prédéfini en tant que macro ... – RidaSana

+0

@Miss: 'Predefined'? Dans la plupart des cas, vous devrez #include un fichier d'en-tête pour obtenir le #define. – harper

2

en C++, faux est intégré littéral de type booléen représentant la valeur false (autre valeur possible est représentée avec le littéral vrai)

FAUX est un #define dont la définition dépend de mai la plate-forme, mais il est généralement 0.

+0

qui signifient false et FALSE sont tous deux de type booléen ... FALSE signifie 0 mais false doit également être 0 car c'est un type booléen.is't – RidaSana

+1

false n'est pas évalué à 0, mais forcé à 0 (ou converti si vous préférez, comme lorsqu'un int est implicitement converti en float). FALSE est réécrit à 0 par le préprocesseur. Notez que FALSE peut aussi être défini par false, cela dépend de la plateforme. –

+1

@Miss: non, 'FALSE' pourrait être un type booléen, mais généralement c'est un type intégral. Vous pourriez l'utiliser comme une valeur booléenne, mais elle est toujours intégrale. C'est très important quand il s'agit de déduction de modèle et de résolution de fonction surchargée, par exemple. 'f (false)' et 'f (FALSE)' peuvent appeler deux fonctions complètement différentes si 'FALSE' s'étend' 0'. –

0

ne pas utiliser FALSE. Comme d'autres l'ont dit, c'est une macro évaluant à 0. J'ai entendu des histoires de personnes quittant une entreprise et mettant (exprès) un #define FALSE 1 dans des endroits aléatoires dans le code. Un moyen sûr de faire des ravages.

Stick avec false car il fait partie de la norme C++.

+0

Semble facilement réparable si votre définition originale incluait '#ifdef FALSE #undef FALSE' –

1

Rappelez-vous simplement ce que les Booléens vrai et faux signifient toujours. Ils vont toujours être des entiers (0,1). Un compilateur peut ne pas le reconnaître mais il sera toujours stocké et exécuté dans le CPU sous forme d'entiers. Un débogueur montrera ceci. Que ce soit en majuscules ou non n'a pas vraiment d'importance car il ne devrait pas être différent dans sa mise en œuvre ou son utilisation. Si vous avez des macros écrites pour supporter les majuscules et les minuscules, vraies et fausses, c'est génial, mais c'est juste pour répondre à vos besoins. Juste comme tous les autres types.

0

Remarque importante sur l'API Windows: certaines fonctions de la bibliothèque WIndows renvoient des valeurs entières arbitraires bien que le type de retour soit défini comme BOOL. Il est préférable de ne jamais comparer BOOL à TRUE. utiliser

bSomeVal != FALSE instead. 
Questions connexes