sirven simbolos relacionales que programacion para operadores operador not los logicos logico comparacion c++

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 para 0x01 , y como 0xff != 0x01 el resultado es false .
  • lo mismo ocurre con las comparaciones a booleano false , solo el valor comparado con ahora es 0x00 .

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.