c++ - tautologia - ¿Cuál es la diferencia entre falso y FALSO?
tabla de verdad p q r (6)
En muchos programas, veo declaraciones con los identificadores FALSE
y false
. ¿Hay alguna diferencia entre ellos en el contexto de C ++?
También en algunos programas, vi bool
y en algún lugar BOOL
. ¿Cuál es la diferencia entre ambos?
¿Alguien puede explicarme la diferencia entre estos identificadores? Gracias.
Nota importante sobre la API de Windows: algunas funciones de la biblioteca de Windows devuelven valores enteros arbitrarios, aunque el tipo de retorno se define como BOOL
. Es mejor nunca comparar un BOOL
con TRUE
. utilizar
bSomeVal != FALSE instead.
Si ha incluido windows.h
, entonces FALSE
es # definido como 0. TRUE
es # definido como 1. No es un tipo booleano, es un tipo entero. Windows también definió el tipo BOOL
, que en realidad es un tipo entero diseñado para acomodar los valores TRUE
y FALSE
.
Las secciones relevantes de código en windows.h
parecen a esto:
#ifdef FALSE
#undef FALSE
#endif
#define FALSE 0
#ifdef TRUE
#undef TRUE
#endif
#define TRUE 1
typedef int BOOL, *PBOOL, *LPBOOL;
Windows se escribió originalmente en C, al igual que todas las aplicaciones de Windows originales. En ese momento, C no tenía un tipo booleano definido por el estándar. En cambio, los desarrolladores se vieron obligados a definir sus propias constantes booleanas. Para evitar el posible desorden que podría causar, Microsoft decidió un estándar que se usaría para todas las aplicaciones de Windows.
Si está escribiendo aplicaciones de Windows, es posible que aún deba usar los identificadores TRUE
y FALSE
. Varias de las funciones definidas en windows.h
aceptan parámetros booleanos (¡en realidad enteros!) Escritos como BOOL
o devuelven valores de ese tipo. C ++, al estar fuertemente tipado, puede quejarse si los obliga al tipo booleano definido en el estándar del idioma. Por coherencia, uso los identificadores antiguos en todas mis llamadas a las funciones de la API de Windows, y las palabras clave true
y false
ahora definidas por el estándar en todos los métodos que escribo yo mismo.
Realmente no hay razón para no usar FALSE
como se define en windows.h
. Pero no debe definirlo usted mismo en un archivo de encabezado propietario, como han mencionado otros, porque no hay garantía de que la definición se mantendrá constante en el tiempo. Eso podría causar algunos errores bastante tontos, el tipo que califican para aparecer en el Daily WTF.
La respuesta de Mat es 100% correcta de que ni TRUE
ni FALSE
están definidos por los estándares C o C ++. Sin embargo, están estrictamente definidos por la API de Windows y se garantiza que no cambien. El uso de ellos no producirá un código C ++ verdaderamente multiplataforma y estrictamente compatible con los estándares, pero eso no suele ser motivo de preocupación al escribir aplicaciones de Windows, ya que ninguno de los dos llamará a ninguna de las otras funciones en windows.h
Solo recuerda lo que significan los verdaderos y falsos booleanos. Siempre van a ser enteros (0,1). Es posible que un compilador no lo reconozca, pero siempre se almacenarán y ejecutarán a través de la CPU como enteros. Un depurador mostrará esto. No importa si está en mayúsculas o no, porque no debería haber ninguna diferencia en su implementación o uso. Si el compilador tiene algunas macros escritas para admitir mayúsculas y minúsculas, tanto verdaderos como falsos, son excelentes, pero es solo para satisfacer sus necesidades. Al igual que todos los otros tipos.
en C ++, falso es un literal incorporado de tipo booleano que representa el valor falso (el otro valor posible se representa con el literal verdadero )
FALSE es un #define cuya definición puede depender de la plataforma, pero generalmente es 0.
FALSE
no está definido en el estándar. Sólo false
es. true
y false
se denominan "literales booleanos" y son palabras clave en C ++.
FALSE
se define a veces como una macro. No puede confiar en que esté presente en un entorno que cumpla con las normas, ya que no forma parte de la norma.
En otras palabras, el siguiente programa es válido en C++
:
#include <iostream>
#define FALSE 1
int main()
{
bool a = false;
bool b = FALSE;
std::cout << a << " " << b << std::endl;
return 0;
}
y se imprimirá 0 1
como se esperaba. FALSE
no es un símbolo privilegiado de ninguna manera.
false
es una palabra clave de C ++.
FALSO no está definido por el estándar C ++. Pero la mayoría de los compiladores tienen FALSE definido como una macro de preprocesador con el valor 0.