Em C e em algumas linguagens similares, comparar expressões booleanas para igualdade false
ou true
é um hábito perigoso.
Em C, qualquer expressão escalar (numérica ou ponteiro) pode ser usada em um contexto booleano, por exemplo, como condição de uma if
instrução. A regra C if (cond)
é equivalente a if (cond != 0)
- ou seja, zero é falso e qualquer valor diferente de zero é verdadeiro. Se cond
é do tipo ponteiro, 0
é tratado como uma constante de ponteiro nulo; if (ptr)
meios if (ptr != NULL)
.
Isso significa que
if (cond)
e
if (cond == true)
não significa a mesma coisa . O primeiro é verdadeiro se cond
for diferente de zero; o segundo é verdadeiro apenas se for igual a true
, que em C (se você tiver #include <stdbool.h>
) é simplesmente 1
.
Por exemplo, a isdigit()
função declarada em <ctype.h>
retorna um int
valor, 0
se o argumento for um dígito, diferente de zero se não for. Pode retornar 42
para indicar que a condição é verdadeira. A comparação 42 == true
falhará.
Acontece que esse 0
é o único valor considerado falso, portanto, a comparação da igualdade false
funcionará; if (!cond)
e if (cond == false)
faça a mesma coisa. Mas se você quiser tirar proveito disso, lembre-se de que comparar com false
está ok e comparar com true
não. Pior ainda, a comparação com true
o trabalho na maioria das vezes (por exemplo, os operadores de igualdade e relacionais sempre produzem um 0
ou outro 1
). Isso significa que qualquer bug que você introduz usando isso ainda pode ser difícil de localizar. (Não se preocupe, eles aparecerão assim que você demonstrar o código para um cliente importante.)
C ++ possui regras ligeiramente diferentes; por exemplo, seu bool
tipo é um pouco mais integrado ao idioma e if (cond)
converte cond
em texto bool
. Mas o efeito é (principalmente) o mesmo.
Algumas outras linguagens têm o que se poderia chamar de booleanos mais bem comportados, de modo que cond == true
e cond == false
(ou seja qual for a sintaxe) seja seguro. Mesmo assim, todas as línguas que eu vi tem um not
ou !
operador; está lá, então você pode usá-lo. Usar, em cond == false
vez de !cond
ou not cond
não, na minha opinião, melhora a legibilidade. (É verdade que o !
personagem pode ser difícil de ver de relance; às vezes adiciono um espaço após o !
para evitar isso.)
E muitas vezes você pode evitar o problema e melhorar a clareza reorganizando o código levemente. Por exemplo, em vez de:
if (!cond) {
do_this();
}
else {
do_that();
}
você pode escrever:
if (cond) {
do_that();
}
else {
do_this();
}
Isso nem sempre é melhor, mas não custa procurar oportunidades onde está.
Resumo: Em C e C ++, as comparações de igualdade true
e false
são perigosas, excessivamente verbais e de estilo pobre. Em muitos outros idiomas, essas comparações podem não ser perigosas, mas ainda são excessivamente verbosas e de estilo pobre.