En C y algunos lenguajes similares, comparar expresiones booleanas para igualdad falseo truees un hábito peligroso.
En C, cualquier expresión escalar (numérica o puntero) se puede utilizar en un contexto booleano, por ejemplo, como la condición de una ifdeclaración. La regla C if (cond)es equivalente a if (cond != 0), es decir, cero es falso y cualquier valor distinto de cero es verdadero. Si condes de tipo puntero, 0se trata como una constante de puntero nulo; if (ptr)significa if (ptr != NULL).
Esto significa que
if (cond)
y
if (cond == true)
No significan lo mismo . El primero es verdadero si condno es cero; el segundo es verdadero solo si es igual a true, que en C (si tiene #include <stdbool.h>) es simplemente 1.
Por ejemplo, la isdigit()función declarada en <ctype.h>devuelve un intvalor, 0si el argumento es un dígito, no cero si no lo es. Puede volver 42para indicar que la condición es verdadera. La comparación 42 == truefallará.
Sucede que ese 0es el único valor considerado falso, por lo que la comparación para igualdad falsefuncionará; if (!cond)y if (cond == false)hacer lo mismo Pero si vas a aprovechar eso, debes recordar que comparar con falseestá bien, y comparar con trueno lo está. Peor aún, la comparación con truefuncionará la mayor parte del tiempo (por ejemplo, los operadores de igualdad y relacionales siempre rinden 0o 1). Esto significa que cualquier error que introduzca al usar esto aún podría ser difícil de rastrear. (No se preocupe, aparecerán tan pronto como demuestre el código a un cliente importante).
C ++ tiene reglas ligeramente diferentes; por ejemplo, su booltipo está un poco más integrado en el lenguaje y se if (cond)convierte conden tipo bool. Pero el efecto es (principalmente) el mismo.
Algunos otros idiomas tienen lo que uno podría llamar booleanos con mejor comportamiento, de modo que cond == truey cond == false(o lo que sea que sea la sintaxis) es seguro. Aun así, cada idioma que he visto tiene un operador notu !; está ahí, así que bien podrías usarlo. Usar en cond == falselugar de !condo not condno, en mi opinión, mejora la legibilidad. (Es cierto que el !personaje puede ser difícil de ver de un vistazo; a veces agrego un espacio después !para evitar esto).
Y a menudo puede evitar el problema y mejorar la claridad reorganizando ligeramente el código. Por ejemplo, en lugar de:
if (!cond) {
do_this();
}
else {
do_that();
}
podrías escribir:
if (cond) {
do_that();
}
else {
do_this();
}
Eso no siempre es mejor, pero no está de más buscar oportunidades donde está.
Resumen: en C y C ++, las comparaciones de igualdad con truey falseson peligrosas, excesivamente detalladas y con un estilo pobre. En muchos otros idiomas, tales comparaciones pueden no ser peligrosas, pero siguen siendo demasiado detalladas y de mal estilo.