83 votes

Utilisation de true et false en C

Pour autant que je sache, il y a 3 façons d'utiliser les booléens en c

  1. avec le type bool, en utilisant ensuite true et false
  2. définition à l'aide du préprocesseur #define FALSE 0 ... #define TRUE !(FALSE)
  3. Pour utiliser directement les constantes, c'est-à-dire 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, le 2 est encore plus facilement lisible (bien que la négation bit à bit ajoute légèrement à la surcharge), le 1 est le plus lisible et n'est pas compatible avec tous les compilateurs.

39 votes

Vous pensez vraiment que le compilateur va attendre l'exécution pour annuler une constante ?

24 votes

Pour ne pas passer pour un crétin, aucun compilateur ne perdra son temps à faire cela. Les compilateurs sont des optimiseurs lourds, et s'ils savent que les résultats seront toujours les mêmes, ils le feront à la place. Il n'attendra jamais l'exécution pour évaluer int i = 12 + 3 * 4; ; ça dira juste int i = 24; . S'inquiéter des performances comme cela est un problème courant, ne vous sentez pas mal. Les optimisations viennent dernier Et quand il arrive, vous devez chronométrer votre code et regarder la sortie de l'assemblage, et non pas deviner. Même si cela coûtait un cycle, j'opterais pour la solution la plus lisible. Seulement quand cela s'avère être un

12 votes

Problème, je passerais à une solution plus rapide, en les chronométrant pour m'assurer qu'elles sont effectivement plus rapides. Si vous avez le choix entre la lisibilité et un cycle, choisissez la lisibilité :) Il est facile de rendre un bon code rapide, mais difficile de rendre un code "rapide" bon.

124voto

Chris Jester-Young Points 102876

Il suffit d'inclure <stdbool.h> si votre système le prévoit. Cela définit un certain nombre de macros, dont bool , false et true (défini à _Bool , 0 et 1 respectivement). Voir la section 7.16 de C99 pour plus de détails.

11 votes

Non "bool" est une macro. Le type est "_Bool". Sinon, cela casserait terriblement le vieux code.

7 votes

Vous pouvez utiliser _Bool sans inclure stdbool.h

22voto

b.roth Points 4198

Il suffit d'utiliser 0 ou 1 directement dans le code.

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

52 votes

Pour les programmeurs C, -1 est également vrai, puisqu'il ne s'agit pas d'un zéro. De même, 42 et -234 sont également des valeurs vraies. J'ai vu -1, -2 et d'autres valeurs comme vraies. Certaines fonctions renvoient 0 (zéro) en tant que succès. Hmmm, voilà pour la cohérence.

1 votes

Je vois généralement 1 ou -1 utilisé comme valeur réelle. -1 parce que c'est tout en un en binaire. J'aimerais bien savoir où vous avez trouvé -2.

8 votes

Je suis d'accord avec Thomas. Le fait que 0 soit utilisé comme code d'erreur pour "pas d'erreur" (et souvent aussi comme code d'erreur pour "pas d'erreur") n'a rien d'étonnant. int ) ne permet pas toujours de savoir si une valeur est censée être utilisée dans un contexte booléen.

18voto

Macarse Points 36519

Je fais habituellement un :

typedef enum {FALSE = 0, TRUE} boolean;

6 votes

Pourquoi mettez-vous explicitement FALSE=0 ? Le premier élément d'un enum n'est-il pas automatiquement 0 ?

12 votes

@lindelof C'est juste au cas où ils ajouteraient FileNotFound au début de cet enum. ;-)

1 votes

@lindelof C'est logique. S'assurer que FALSE est égal à 0 est la seule chose importante. TRUE peut être n'importe quoi, du moment que c'est différent.

5voto

Doug T. Points 33360

Avec le type bool défini par stdbool.h, des problèmes surviennent lorsque vous devez déplacer du code d'un compilateur plus récent qui supporte le type bool vers un compilateur plus ancien. Cela peut se produire dans un environnement de programmation embarqué lorsque vous passez à une nouvelle architecture avec un compilateur C basé sur une ancienne version de la spécification.

En résumé, je m'en tiendrais aux macros lorsque la portabilité est importante. Sinon, faites ce que les autres recommandent et utilisez le type bulit in.

2voto

anthares Points 5536

Je choisirais le 1. Je n'ai pas rencontré d'incompatibilité avec elle et elle est plus naturelle. Mais, je pense que cela fait partie de la norme C++ et non C. Je pense qu'avec un piratage sale avec des définitions ou votre troisième option, vous ne gagnerez aucune performance, mais seulement de la peine à maintenir le code.

5 votes

bool fait partie du C++, mais _Bool (avec bool comme alias) fait maintenant partie de C (à partir de C99).

0 votes

C'est bon à savoir. Merci. :)

0 votes

Je n'opterais pas pour 1, car toute valeur non nulle est vraie. Donc, avec des quantités signées, -1 est également vrai.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X