Em C e em algumas linguagens similares, comparar expressões booleanas para igualdade falseou 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 ifinstruçã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 condfor 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 intvalor, 0se o argumento for um dígito, diferente de zero se não for. Pode retornar 42para indicar que a condição é verdadeira. A comparação 42 == truefalhará.
Acontece que esse 0é o único valor considerado falso, portanto, a comparação da igualdade falsefuncionará; if (!cond)e if (cond == false)faça a mesma coisa. Mas se você quiser tirar proveito disso, lembre-se de que comparar com falseestá ok e comparar com truenão. Pior ainda, a comparação com trueo trabalho na maioria das vezes (por exemplo, os operadores de igualdade e relacionais sempre produzem um 0ou 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 booltipo é um pouco mais integrado ao idioma e if (cond)converte condem 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 == truee cond == false(ou seja qual for a sintaxe) seja seguro. Mesmo assim, todas as línguas que eu vi tem um notou !operador; está lá, então você pode usá-lo. Usar, em cond == falsevez de !condou not condnã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 truee falsesã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.