web-dev-qa-db-fra.com

Utiliser true et false en C

Autant que je sache, il y a 3 façons d'utiliser des booléens dans c

  1. avec le type bool, à partir de true et false
  2. définition à l'aide du préprocesseur #define FALSE 0 ... #define TRUE !(FALSE)
  3. Juste pour utiliser les constantes directement, à savoir 1 et 0

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.

57
Tom

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.

94
Chris Jester-Young

tilisez juste 0 ou 1 directement dans le code.

Pour les programmeurs C, c'est aussi intuitif que vrai ou faux.

18
b.roth

Je fais habituellement un:

typedef enum {FALSE = 0, TRUE} boolean;
15
Macarse

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.

4
Doug T.

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.

4
Bob Wakefield

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
3
Nick Van Brunt

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.

2
anthares

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.

2
Lothar

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.

2
wallyk

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
Maurizio Reginelli

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++.

1
Clifford

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.

1
T.E.D.

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.

0
Marco Demaio

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

0
debuti

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à.

0
Will Marcouiller