En C et certaines langues similaires, en comparant les expressions booléennes pour l' égalité à false
ou true
est 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 if
instruction. 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 cond
est de type pointeur, 0
est 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 cond
est 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 int
valeur, 0
si l'argument est un chiffre, différent de zéro s'il ne l'est pas. Il peut revenir 42
pour indiquer que la condition est vraie. La comparaison 42 == true
échouera.
Il se trouve que 0
c'est la seule valeur considérée comme fausse, alors la comparaison pour l'égalité false
fonctionnera; if (!cond)
et if (cond == false)
faire la même chose. Mais si vous voulez en tirer parti, vous devez vous rappeler que comparer à false
est correct, et que comparer true
ne l’est pas. Pire encore, comparer à true
fonctionnera la plupart du temps (par exemple, les opérateurs d'égalité et relationnels donnent toujours un 0
ou 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 bool
type est un peu plus étroitement intégré dans le langage et est if (cond)
converti cond
en 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 == true
et 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 not
ou !
; c'est là, alors vous pourriez aussi bien l'utiliser. Utiliser cond == false
plutôt que !cond
ou not cond
n'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é à true
et false
sont 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.