为什么布尔值在C ++中按位进行比较,而不是按其含义进行比较?

v010dya

我希望下面的代码产生相等性,但是bool值显示为不同。

#include <iostream>

union crazyBool
{
    unsigned char uc;
    bool b;
};

int main()
{
    crazyBool a, b;
    a.uc = 1;
    b.uc = 5;

    if(a.b == b.b)
    {
            std::cout << "==" << std::endl;
    }
    else
    {
            std::cout << "!=" << std::endl;
    }

    bool x, y;
    void *xVP = &x, *yVP = &y;
    unsigned char *xP = static_cast<unsigned char*>(xVP);
    unsigned char *yP = static_cast<unsigned char*>(yVP);

    (*xP) = (unsigned char)1;
    (*yP) = (unsigned char)5;

    if(x == y)
    {
            std::cout << "==" << std::endl;
    }
    else
    {
            std::cout << "!=" << std::endl;
    }
    return 0;
}

请注意,这里我们不仅要通过并集(被指出是未定义的)更改值,而且还要直接通过void指针访问内存。

塞巴斯蒂安·雷德尔(Sebastian Redl)

如果您分配给工会的成员,则该成员将成为活动成员。

读取活动成员以外的任何成员都是未定义的行为,这意味着任何事情都可能发生。该规则有一些特定的例外情况,具体取决于编译器遵循的C ++标准版本。但这些例外均不适用于您的情况。

(一个例外是,如果联合具有多个类类型的成员,而这些类具有相同的初始成员,则可以通过联合的任何成员来读取这些共享的成员。)

编辑以解决问题:

该标准将bool定义为具有truefalse,没有其他(C ++ 11,3.9.1 / 6)它从未定义在存储上复制其他位模式的含义(这就是您正在做的事情)。由于未定义,因此行为也未定义。

是的,将整数转换为bool时0会变为false,而其他任何条件都将变为true,但这仅是转换规则,而不是有关bool表示的声明。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么在比较布尔值时,按位运算符比Java中的“正常”运算符要慢?

来自分类Dev

为什么不仅仅将布尔值进行比较?

来自分类Dev

为什么有人会在C语言中按位与8位值和16位掩码进行比较?

来自分类Dev

为什么此布尔值在C ++中而不在Java中编译?

来自分类Dev

为什么此查询导致布尔值而不是数字?

来自分类Dev

为什么渲染json:返回NULL而不是布尔值

来自分类Dev

为什么不是这个if语句返回布尔值?

来自分类Dev

为什么此查询导致布尔值而不是数字?

来自分类Dev

为什么布尔值更改Java方法中的值

来自分类Dev

C#中的Equals是否按引用或值进行比较?

来自分类Dev

为什么将标志与位掩码和标志的按位 AND 的结果进行比较?

来自分类Dev

C ++中带有布尔值的^(按位XOR)

来自分类Dev

即使文档中没有说明布尔值,为什么布尔值也是可复制的?

来自分类Dev

pandas.DataFrame为什么使用括号来包装操作以进行按位比较

来自分类Dev

为什么在布尔表达式中不隐式转换非布尔值?

来自分类Dev

有什么理由在C ++中为布尔使用枚举而不是已经存在的布尔值吗?

来自分类Dev

有什么理由在C ++中为布尔使用枚举而不是已经存在的布尔值吗?

来自分类Dev

为什么要使用1bit位域而不是布尔值?

来自分类Dev

比较布尔值

来自分类Dev

为什么我在React Native中对此布尔值有两个不同的值?

来自分类Dev

在java.util.HashMap中,为什么modcount不是布尔值?

来自分类Dev

按位运算以比较值

来自分类Dev

为什么布尔类型不能快速进行按位运算

来自分类Dev

为什么mysqli_query被评估为布尔值而不是结果集

来自分类Dev

为什么我的布尔值一直显示 no 而不是 yes 或 no?

来自分类Dev

为什么需要在Lua(cocos2d-x)中返回布尔值

来自分类Dev

为什么布尔值会在QAbstractTableModel中创建一个下拉菜单?

来自分类Dev

为什么布尔值会在QAbstractTableModel中创建一个下拉菜单?

来自分类Dev

为什么需要在Lua(cocos2d-x)中返回布尔值

Related 相关文章

  1. 1

    为什么在比较布尔值时,按位运算符比Java中的“正常”运算符要慢?

  2. 2

    为什么不仅仅将布尔值进行比较?

  3. 3

    为什么有人会在C语言中按位与8位值和16位掩码进行比较?

  4. 4

    为什么此布尔值在C ++中而不在Java中编译?

  5. 5

    为什么此查询导致布尔值而不是数字?

  6. 6

    为什么渲染json:返回NULL而不是布尔值

  7. 7

    为什么不是这个if语句返回布尔值?

  8. 8

    为什么此查询导致布尔值而不是数字?

  9. 9

    为什么布尔值更改Java方法中的值

  10. 10

    C#中的Equals是否按引用或值进行比较?

  11. 11

    为什么将标志与位掩码和标志的按位 AND 的结果进行比较?

  12. 12

    C ++中带有布尔值的^(按位XOR)

  13. 13

    即使文档中没有说明布尔值,为什么布尔值也是可复制的?

  14. 14

    pandas.DataFrame为什么使用括号来包装操作以进行按位比较

  15. 15

    为什么在布尔表达式中不隐式转换非布尔值?

  16. 16

    有什么理由在C ++中为布尔使用枚举而不是已经存在的布尔值吗?

  17. 17

    有什么理由在C ++中为布尔使用枚举而不是已经存在的布尔值吗?

  18. 18

    为什么要使用1bit位域而不是布尔值?

  19. 19

    比较布尔值

  20. 20

    为什么我在React Native中对此布尔值有两个不同的值?

  21. 21

    在java.util.HashMap中,为什么modcount不是布尔值?

  22. 22

    按位运算以比较值

  23. 23

    为什么布尔类型不能快速进行按位运算

  24. 24

    为什么mysqli_query被评估为布尔值而不是结果集

  25. 25

    为什么我的布尔值一直显示 no 而不是 yes 或 no?

  26. 26

    为什么需要在Lua(cocos2d-x)中返回布尔值

  27. 27

    为什么布尔值会在QAbstractTableModel中创建一个下拉菜单?

  28. 28

    为什么布尔值会在QAbstractTableModel中创建一个下拉菜单?

  29. 29

    为什么需要在Lua(cocos2d-x)中返回布尔值

热门标签

归档