variable values type tipo dato booleano bool c++ boolean

c++ - values - ¿Por qué bool y no bool ambos regresan verdad en este caso?



if bool c++ (3)

Esta pregunta ya tiene una respuesta aquí:

Este es mi código:

#include <cstring> #include <iostream> int main() { bool a; memset(&a, 0x03, sizeof(bool)); if (a) { std::cout << "a is true!" << std::endl; } if (!a) { std::cout << "!a is true!" << std::endl; } }

Emite:

a is true! !a is true!

Parece que el ! operador en bool solo invierte el último bit, pero cada valor que no es igual a 0 se trata como true . Esto lleva al comportamiento mostrado, que es lógicamente incorrecto. ¿Es eso un error en la implementación, o la especificación lo permite? Tenga en cuenta que el memset se puede omitir y que el comportamiento probablemente sea ​​el mismo porque contiene basura de memoria.

Estoy en gcc 4.4.5, otros compiladores pueden hacerlo de manera diferente.


El estándar (3.9.1 / 6 tipos fundamentales) dice:

Los valores de tipo bool son verdaderos o falsos.

....

El uso de un valor bool en formas descritas por esta Norma Internacional como "indefinidas", como al examinar el valor de un objeto automático no inicializado, puede hacer que se comporte como si no fuera ni verdadero ni falso.

El uso que su programa hace de memset conduce a un comportamiento indefinido. La consecuencia de esto podría ser que el valor no es ni verdadero ni falso.


Internamente, es probable que se use un operador bit (no operador) para invertirlo, lo que funcionaría cuando el bool fuera cero o todos:

a = 00000000 (false) !a = 11111111 (true)

Sin embargo, si lo configuras en tres:

a = 00000011 (true) !a = 11111100 (also true)


No es "lógicamente incorrecto", es un comportamiento indefinido. bool solo debe contener uno de dos valores, true o false . Asignarle un valor provocará una conversión a uno de estos valores. Romper la seguridad de tipo al escribir un valor de byte arbitrario en la parte superior de su memoria (o, como usted menciona, dejarlo sin pintar) no lo hará, por lo que podría terminar con un valor que no sea ni true ni false .