为什么bool和not bool在这种情况下都返回true

Why does bool and not bool both return true in this case?

本文关键字:bool 返回 true 这种情况下 not 为什么      更新时间:2023-10-16

这是我的代码:

#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基本类型)规定:

布尔类型的值为true或false。

以本国际标准中描述为"未定义"的方式使用布尔值,例如通过检查未初始化的自动对象,可能会导致它的行为看起来既不是true也不是false。

您的程序使用memset会导致未定义的行为。其结果可能是该值既不是真也不是假。

这不是"逻辑错误",而是未定义的行为。假定bool仅包含truefalse这两个值中的一个。为其赋值将导致转换为其中一个值。通过在内存顶部写入任意字节值(或者,正如您所提到的,让它不被理解)来破坏类型安全性是不会的,所以您很可能最终得到一个既不是true也不是false的值。

在内部,它可能使用逐位not(~运算符)来反转它,当bool为零或全为1时,这将起作用:

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

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

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