为什么在这种情况下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
只能包含两个值之一, true
或false
。 为其分配值将导致转换为这些值之一。 通过在内存上写入一个任意字节值来打破types安全(或者,正如你所提到的,让它不被人为地使用)将不会被破坏,所以你最终可能会得到一个既不true
也不false
。
在内部,它可能使用一个按位而不是( ~
运算符)来反转,当bool为零或全部时,
a = 00000000 (false) !a = 11111111 (true)
但是,如果将其设置为三:
a = 00000011 (true) !a = 11111100 (also true)