En C et certaines langues similaires, en comparant les expressions booléennes pour l' égalité à falseou trueest une habitude dangereuse.
En C, toute expression scalaire (numérique ou pointeur) peut être utilisée dans un contexte booléen, par exemple en tant que condition d'une ifinstruction. La règle C if (cond)est équivalente à if (cond != 0)- c’est- à -dire que zéro est faux et que toute valeur autre que zéro est vraie. Si condest de type pointeur, 0est traitée comme une constante de pointeur nulle. if (ptr)des moyens if (ptr != NULL).
Cela signifie que
if (cond)
et
if (cond == true)
ne veut pas dire la même chose . Le premier est vrai si condest non nul; la seconde n'est vraie que si elle est égale à true, ce qui en C (si vous avez #include <stdbool.h>) est simplement 1.
Par exemple, la isdigit()fonction déclarée dans <ctype.h>renvoie une intvaleur, 0si l'argument est un chiffre, différent de zéro s'il ne l'est pas. Il peut revenir 42pour indiquer que la condition est vraie. La comparaison 42 == trueéchouera.
Il se trouve que 0c'est la seule valeur considérée comme fausse, alors la comparaison pour l'égalité falsefonctionnera; if (!cond)et if (cond == false)faire la même chose. Mais si vous voulez en tirer parti, vous devez vous rappeler que comparer à falseest correct, et que comparer truene l’est pas. Pire encore, comparer à truefonctionnera la plupart du temps (par exemple, les opérateurs d'égalité et relationnels donnent toujours un 0ou 1). Cela signifie que tous les bogues que vous introduisez en utilisant ceci pourraient être difficiles à localiser. (Ne vous inquiétez pas, ils apparaîtront dès que vous aurez présenté le code à un client important.)
C ++ a des règles légèrement différentes. par exemple, son booltype est un peu plus étroitement intégré dans le langage et est if (cond)converti conden dactylographie bool. Mais l'effet est (principalement) le même.
Certaines autres langues ont ce que l’on pourrait appeler des booléens plus sages, tels que cond == trueet cond == false(ou quelle que soit la syntaxe qui s’avère) est sans danger. Malgré tout, chaque langue que j'ai vue a un opérateur notou !; c'est là, alors vous pourriez aussi bien l'utiliser. Utiliser cond == falseplutôt que !condou not condn'améliore pas, à mon avis, la lisibilité. (Il est vrai que le !personnage peut être difficile à voir d'un coup d'œil; j'ajoute parfois un espace après le !pour l'éviter.)
Et souvent, vous pouvez éviter le problème et améliorer la clarté en réorganisant légèrement le code. Par exemple, plutôt que:
if (!cond) {
do_this();
}
else {
do_that();
}
vous pourriez écrire:
if (cond) {
do_that();
}
else {
do_this();
}
Ce n'est pas toujours mieux, mais il n'y a pas de mal à chercher des opportunités là où elles se trouvent.
Résumé: En C et C ++, les comparaisons d'égalité à trueet falsesont dangereux, trop bavard, et le style pauvre. Dans de nombreuses autres langues, de telles comparaisons ne sont peut-être pas dangereuses, mais elles sont toujours trop verbeuses et d'un style médiocre.