这是我的代码:
#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;
}
}
Run Code Online (Sandbox Code Playgroud)
它输出:
a is true!
!a is true!
Run Code Online (Sandbox Code Playgroud)
似乎!运算符bool仅反转最后一位,但每个不相等的值0都被视为true.这导致显示的行为,这在逻辑上是错误的.这是实施中的错误,还是规范允许这样做?请注意,memset可以省略,并且行为可能是相同的,因为a包含内存垃圾.
我正在使用gcc 4.4.5,其他编译器可能会采用不同的方式.
Dav*_*nan 92
标准(3.9.1/6基本类型)说:
bool类型的值为true或false.
....
以本国际标准描述的方式将bool值用作"未定义",例如通过检查未初始化的自动对象的值,可能会使其表现为既不是真也不是假.
您的程序的使用memset导致未定义的行为.其后果可能是价值既不真实也不虚假.
Mik*_*our 41
这不是"逻辑错误",它是未定义的行为.bool只应该包含两个值中的一个,true或者false.为其分配值将导致转换为其中一个值.通过在其内存上写入任意字节值来打破类型安全(或者,正如您所提到的那样,将其保留为未初始化)不会,因此您最终可能会得到一个既不是true也不是false.