首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么在这种情况下bool和not bool都返回true?

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

Stack Overflow用户
提问于 2014-04-24 20:03:14
回答 2查看 5.1K关注 0票数 71

这是我的代码:

代码语言:javascript
复制
#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;
    }
}

它输出:

代码语言:javascript
复制
a is true!
!a is true!

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

我使用的是gcc 4.4.5,其他编译器可能会有不同的做法。

EN

回答 2

Stack Overflow用户

发布于 2014-04-24 20:11:00

这不是“逻辑上的错误”,而是一种未定义的行为。bool应该只包含两个值中的一个:truefalse。为其赋值将导致转换为这些值之一。在内存之上写入一个任意字节值(或者,正如您所提到的,让它保持未初始化)将不会破坏类型安全,因此您很可能最终得到一个既不是true也不是false的值。

票数 42
EN

Stack Overflow用户

发布于 2014-04-26 17:31:31

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

代码语言:javascript
复制
 a = 00000000 (false)
!a = 11111111 (true)

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

代码语言:javascript
复制
 a = 00000011 (true)
!a = 11111100 (also true)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23268357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档