Autant que je sache, il y a 3 façons d'utiliser des booléens dans c
#define FALSE 0 ... #define TRUE !(FALSE)
y a-t-il d'autres méthodes que j'ai manquées? Quels sont les avantages et les inconvénients des différentes méthodes?
Je suppose que le plus rapide serait le numéro 3, 2 est encore plus facilement lisible (bien que la négation au niveau des bits alourdisse légèrement la surcharge), 1 est plus lisible et incompatible avec tous les compilateurs.
Il suffit d'inclure <stdbool.h>
si votre système le fournit. Cela définit un nombre de macros, y compris bool
, false
et true
(défini à _Bool
, 0 et 1 respectivement). Voir la section 7.16 de la C99 pour plus de détails.
tilisez juste 0 ou 1 directement dans le code.
Pour les programmeurs C, c'est aussi intuitif que vrai ou faux.
Je fais habituellement un:
typedef enum {FALSE = 0, TRUE} boolean;
Avec le type bool défini par stdbool.h, des problèmes surviennent lorsque vous devez déplacer le code d'un compilateur récent prenant en charge le type bool vers un compilateur plus ancien. Cela peut se produire dans un environnement de programmation intégré lorsque vous passez à une nouvelle architecture avec un compilateur C basé sur une version plus ancienne de la spécification.
En résumé, je resterais avec les macros lorsque la portabilité est importante. Sinon, faites ce que les autres recommandent et utilisez le type bulit.
Quel que soit le critère choisi, comparez vos variables avec FALSE ou false.
Historiquement, comparer n'importe quoi à vrai (1) en c ou c ++ est une mauvaise idée. Seul faux est garanti à zéro (0). True est toute autre valeur. De nombreux fournisseurs de compilateurs ont ces définitions quelque part dans leurs en-têtes.
#define TRUE 1
# définir FALSE 0
Cela a conduit trop de gens sur le chemin du jardin. De nombreuses fonctions de la bibliothèque, à part le type de graphique, renvoient des valeurs non nulles différentes de 1 en cas de succès. Il existe beaucoup de codes hérités ayant le même comportement.
Vous pouvez tester si bool est défini dans c99 stdbool.h avec
#ifndef __bool_true_false_are_defined || __bool_true_false_are_defined == 0
//typedef or define here
#endif
Je voudrais aller pour 1. Je n'ai pas rencontré d'incompatibilité avec elle et est plus naturel. Mais, je pense que cela fait partie du standard C++ et non du standard C. Je pense qu’avec le piratage informatique avec les définitions ou votre troisième option, vous n’obtiendrez pas de performances, mais vous aurez du mal à conserver le code.
Je préfère (1) quand je définis une variable mais dans des expressions que je ne compare jamais à vrai et à faux, prenons simplement la définition C implicite de if (drapeau) ou de si (drapeau!) Ou de si (ptr). C’est la façon de faire les choses.
Tout int autre que zéro est vrai; faux est zéro. Ainsi, un code comme celui-ci continue de fonctionner comme prévu:
int done = 0; // `int` could be `bool` just as well
while (!done)
{
// ...
done = OS_SUCCESS_CODE == some_system_call ();
}
IMO, bool
est un type surestimé, peut-être un report d'autres langues. int
fonctionne très bien comme un type booléen.
Je préfère la troisième solution, c’est-à-dire utiliser 1 et 0, car elle est particulièrement utile lorsque vous devez vérifier si une condition est vraie ou fausse: vous pouvez simplement utiliser une variable pour l’argument if.
Si vous utilisez d'autres méthodes, je pense que pour être cohérent avec le reste du code, je devrais utiliser un test comme celui-ci:
if (variable == TRUE)
{
...
}
au lieu de:
if (variable)
{
...
}
1 est le plus lisible, pas compatible avec tous les compilateurs.
Aucun compilateur ISO C n'a un type intégré appelé bool
. Les compilateurs ISO C99 ont un type _Bool
, et un en-tête dans lequel typedef est bool
. Ainsi, la compatibilité consiste simplement à fournir votre propre en-tête si le compilateur n'est pas conforme à C99 (VC++ par exemple).
Bien sûr, une approche plus simple consiste à compiler votre code C en tant que C++.
Il n'y a pas de réelle différence de vitesse. Ils sont vraiment tous les mêmes pour le compilateur. La différence réside dans le fait que les êtres humains essaient d'utiliser et de lire votre code.
Pour moi, cela fait de bool, true et false le meilleur choix en code C++. Dans le code C, certains compilateurs ne supportent pas bool (je dois souvent travailler avec d'anciens systèmes), je peux donc utiliser les définitions dans certaines circonstances.
J'avais l'habitude d'utiliser #define parce qu'ils facilitent la lecture du code et qu'il ne devrait pas y avoir de dégradation des performances par rapport à l'utilisation de nombres (0,1) car le pré-processeur convertit la #define en nombres avant la compilation. Une fois l’application lancée, le préprocesseur n’intervient plus car le code est déjà compilé.
BTW il devrait être:
#define FALSE 0
#define TRUE 1
et rappelez-vous que -1, -2, ... 2, 3, etc. sont tous considérés comme vrais.
Je préfère utiliser
#define FALSE (0!=0)
#define TRUE (0==0)
ou directement dans le code
if (flag == (0==0)) { ... }
Le compilateur se chargera de cela. J'utilise beaucoup de langues et je dois garder à l'esprit que FAUX est nul, cela me dérange beaucoup; mais si je dois, je pense habituellement à cette boucle de chaîne
do { ... } while (*ptr);
et cela me conduit à voir que FALSE est 0
Je ne vous connais pas de situation spécifique. À l'époque où j'écrivais des programmes en C, nous avions toujours utilisé le n ° 2.
#define FALSE = 0
#define TRUE = !FALSE
Cela pourrait être autrement sous une plate-forme étrangère aux processeurs DOS ou Intel. Mais j’avais l’habitude d’utiliser C et ASM en écrivant des bibliothèques graphiques et des IDE graphiques. J'étais un vrai fan de Micheal Abrash et j'avais l'intention d'apprendre sur le mappage de texture, etc. En tous cas! Ce n'est pas le sujet de la question ici!
C'était la forme la plus couramment utilisée pour définir les valeurs booléennes en C, car ce fichier stdbool.h d'en-tête n'existait pas à ce moment-là.