Pour autant que je sache, il y a 3 façons d'utiliser les booléens en c
- avec le type bool, en utilisant ensuite true et false
- définition à l'aide du préprocesseur
#define FALSE 0 ... #define TRUE !(FALSE)
- 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 justeint 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 un12 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.
20 votes
Lorsque vous utilisez les macros, n'oubliez pas que
(x == TRUE)
n'est pas la même chose que(x)
. La première est vraie seulement six
détient la valeur deTRUE
. Ce dernier point est vrai pour toute valeur non nulle.0 votes
+1 @Devon, la plupart du temps, je n'utilise les constantes que comme valeurs de retour.
6 votes
Je déconseille de définir des macros booléennes spéciales ; cela ne fait qu'inciter les programmeurs novices à écrire des choses comme
if(foo == TRUE)
ouif(foo == FALSE)
ce qui est une atrocité dans la plupart des langages, mais encore plus en C, où toute valeur scalaire!= 0
est considéré comme vrai dans les contextes booléens ; pour des raisons similaires, mais moins sévères, je n'aime pasif(foo != NULL)
etif(foo == NULL)
pour les pointeurs ; comme cela ne peut pas introduire de bogues par rapport àTRUE
peut, c'est simplement une question de goût, mais l'utilisation de laif(foo)
etif(!foo)
pour toute valeur scalaire est, à mon avis, plus conforme à l'aspect et à la convivialité du langage C.1 votes
stackoverflow.com/questions/1921539/utilisation de valeurs booléennes dans l'industrie de l'automobile
0 votes
"Quel est le meilleur..." est *toujours subjective, et trop facilement discutable pour être risquée. J'ai modifié le texte de la question pour aider, mais même cela n'est pas sûr. Enfin, je suis avec jamesdlin...
0 votes
@GManNickG en fait, je m'attendrais à ce que cela soit manqué par les compilateurs lorsque la constante est utilisée au-delà des limites de l'unité de compilation. ("dans un fichier C différent") . L'optimiser nécessiterait que le code soit optimisé après l'édition de liens, car la valeur ne peut être connue pendant la compilation de l'unité de compilation actuelle. (avant d'établir un lien) . Avez-vous une idée de la manière dont les compilateurs évitent cela ?
1 votes
Umm... Je ne suis pas un expert en informatique mais est-ce que
!(FALSE)
logique négation ? Sinon, si!
était de type binaire, il serait évalué à-1
Non ?