c++ - simbolos - El bool diseñado se compara igual a verdadero y falso, ¿por qué?
operadores relacionales y logicos (5)
El ejemplo de fuelle se compila, pero la salida es bastante extraña:
#include <iostream>
#include <cstring>
struct A
{
int a;
char b;
bool c;
};
int main()
{
A v;
std::memset( &v, 0xff, sizeof(v) );
std::cout << std::boolalpha << ( true == v.c ) << std::endl;
std::cout << std::boolalpha << ( false == v.c ) << std::endl;
}
la salida es:
true
true
¿Alguien puede explicar por qué?
Si importa, estoy usando g ++ 4.3.0
Creo que encontré la respuesta. 3.9.1-6 dice:
Los valores de tipo bool son verdaderos o falsos.42) [Nota: no hay tipos o valores de valores bool con signo, sin signo, cortos o largos. ] Como se describe a continuación, los valores bool se comportan como tipos integrales. Los valores de tipo bool participan en promociones integrales (4.5).
Donde dice la nota 42:
42) El uso de un valor bool en las formas descritas por esta Norma Internacional como "indefinidas", como al examinar el valor de una variable automática no inicializada, puede hacer que se comporte como si no fuera ni verdadero ni falso.
El resultado de sobrescribir la ubicación de la memoria utilizada por v
es un comportamiento indefinido . Todo puede suceder, de acuerdo con el estándar (incluida la computadora que vuela y se toma el desayuno).
Encontré esto en el estándar de C ++, sección 3.9.1 "Tipos fundamentales" (note la nota de pie de página 42):
6. Values of type bool are either true or false. 42)
42) El uso de un valor bool en las formas descritas por esta Norma Internacional como "indefinidas", como al examinar el valor de una variable automática no inicializada, puede hacer que se comporte como si no fuera ni verdadero ni falso.
Esto no está perfectamente claro para mí, pero parece responder la pregunta.
Parece que no puedo encontrar nada en el estándar que indique por qué sucedería esto (posiblemente sea mi culpa aquí); esto incluye la referencia proporcionada por 7vies, que no es en sí muy útil. Definitivamente es un comportamiento indefinido, pero no puedo explicar el comportamiento específico que es observado por el OP .
Como cuestión práctica, estoy muy sorprendido de que la salida sea
true
true
Usando VS2010, la salida es mucho más fácil de explicar:
false
false
En este último caso, lo que sucede es:
- El compilador implementa comparaciones con boolean
true
como pruebas de igualdad para0x01
, y como0xff != 0x01
el resultado esfalse
. - lo mismo ocurre con las comparaciones a booleano
false
, solo el valor comparado con ahora es0x00
.
No puedo pensar en ningún detalle de implementación que haga que false
comparado con el valor 0xff
cuando se interpreta como bool
. ¿Alguien tiene alguna idea sobre eso?
Un valor booleano cuya memoria se establece en un valor que no es uno o cero tiene un comportamiento indefinido.