为什么在这种情况下bool而不是bool都返回true?

这是我的代码:

#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; } } 

它输出:

 a is true! !a is true! 

这似乎! bool运算符只会反转最后一位,但是每个不等于0值都被视为true 。 这导致了所示的行为,这在逻辑上是错误的。 这是实施过程中的错误,还是规范允许这样做? 请注意, memset可以省略,行为可能会相同,因为a包含内存垃圾。

我在gcc 4.4.5,其他编译器可能会做不同的。

标准(3.9.1 / 6基本types)说:

booltypes的值是真或假。

….

以本标准中描述的方式使用bool值为“未定义”,例如通过检查未初始化的自动对象的值,可能会导致其行为如同既不正确也不正确。

您的程序使用memset会导致未定义的行为。 其后果可能是价值既非真实也非虚假。

这不是“逻辑错误”,它是未定义的行为。 bool只能包含两个值之一, truefalse 。 为其分配值将导致转换为这些值之一。 通过在内存上写入一个任意字节值来打破types安全(或者,正如你所提到的,让它不被人为地使用)将不会被破坏,所以你最终可能会得到一个既不true也不false

在内部,它可能使用一个按位而不是( ~运算符)来反转,当bool为零或全部时,

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

但是,如果将其设置为三:

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