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

霍基

最近,在工作中使用gtest时,我收到了一些有趣的错误代码,这让我感到奇怪:

error: Expected: b1
      Which is: true
To be equal to: b2
      Which is: true

这是测试的结果EXPECT_EQ(bool b1, bool b2)(伪代码)。我做了一些挖掘,这是带有注释的示例代码:

{
    bool b1, b2; //uninitialized bool variables
    //lets say we are a good programmer
    b1 = b2 = true;
    if(b1)
      if(b2)
           if(b1 == b2)
               std::cout << "You are a good programmer!" << std::endl;
}
{
    bool b1, b2; //uninitialized bool variables
    //but we are not always good programmers - b1 and b2 remains uninitialized
    auto p1 = reinterpret_cast<unsigned char*>(&b1);
    *p1 = 3;
    auto p2 = reinterpret_cast<unsigned char*>(&b2);
    *p2 = 7;
    //code above is a simulation that b1 and b2 contains some trash that was left in the memory
    if(b1){
        std::cout << "b1 is true. \n";
        if(b2){
            std::cout << "b2 is true. \n";
            if(b1 == b2)
                std::cout << "b1 == b2" << std::endl;
            else
                std::cout << "b1 != b2" << std::endl;
        }
    }
}

上面的代码输出:

You are a good programmer!
b1 is true.
b2 is true. 
b1 != b2

首先,这很有意义,您与UB一起玩,就得到了应得的。我知道一个简单的解决方案是“成为一名优秀的程序员,并始终初始化变量”,但对我来说,显示的行为使调试变得更加困难,因为如果前两个条件为真,则无论状态如何,您都希望第三个条件始终为真。布尔变量是否已初始化。用int而不是bool来运行示例代码对我来说是很有意义的-如果C ++将0false和其他都视为true,则检查intif(some_int)将检查非零数字,然后进行比较将比较实际数字。

但是对于布尔,我希望通过比较字节的最后一位,比较“功能”仅检查两种状态(对与错),而不是对255种可能的状态进行比较的全部八个。

所以我的问题是:

为什么C ++在比较布尔值时会比较整个字节,而不是只包含真/假信息的最后一位。

最小可复制示例

保罗·桑德斯

一句话:效率。比较两个字节要比比较两个位花费更少的机器代码指令,因为在后一种情况下,需要附加的掩码指令。

参见Godbolt上的示例:https://godbolt.org/z/uJ2xXy

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么不仅仅将哈希函数迭代10,000,000次?

来自分类Dev

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

来自分类Dev

Lua:尝试将布尔值与数字进行比较

来自分类Dev

为什么python创建返回值的新副本而不仅仅是多处理中的引用

来自分类Dev

为什么接口IEnumerable返回IEnumerator GetEnumemrator()?为什么不仅仅实现IEnumerator接口呢?

来自分类Dev

为什么Finatra为什么使用flatMap而不仅仅是地图?

来自分类Dev

为什么将参数解析为布尔值?

来自分类Dev

为什么Ajax.ActionLink会更新整个页面,而不仅仅是UpdateTarget

来自分类Dev

为什么是xmlns:xsi,而不仅仅是XML文档中的xsi?

来自分类Dev

为什么我应该监视流程,而不仅仅是链接和陷阱出口?

来自分类Dev

反应本机| 为什么我的函数立即运行,而不仅仅是onPress?

来自分类Dev

为什么获取会返回“ TypeError:无法获取”,而不仅仅是“无法获取”?

来自分类Dev

为什么我整个div都是可点击的,而不仅仅是链接?

来自分类Dev

为什么要使用延迟变量/计算属性,而不仅仅是方法

来自分类Dev

为什么需要使用Flask扩展,而不仅仅是裸库?

来自分类Dev

Flink,为什么 CoMap 返回“DataStream with Product with Serializable”而不仅仅是 DataStream?

来自分类Dev

为什么要实现 Comparator<t> 而不仅仅是 Comparator

来自分类Dev

为什么这个 SUM 是所有分数,而不仅仅是最好的 5 分?

来自分类Dev

为什么需要使用 new Random() 而不仅仅是 Random Randomnum?

来自分类Dev

为什么Pytorch Dropout层会影响所有值,而不仅仅是设置为零的那些值?

来自分类Dev

Php:为什么我的代码会回显表中的所有值,而不仅仅是这些值的一个子集?

来自分类Dev

比较布尔值

来自分类Dev

如果键已经存在,为什么stl map插入另一个值,而不仅仅是更改它?

来自分类Dev

为什么整个列的值在每次迭代后都会改变,而不仅仅是一个特定的单元格?

来自分类Dev

为什么我要快速创建单例,而不仅仅是将函数转储到文件中?

来自分类Dev

为什么说布尔值给定

来自分类Dev

为什么地图助手扩展哈希图会很有用?为什么不仅仅使用hashmap?

来自分类Dev

将字符串转换为布尔值并与 js 中的 if 条件进行比较

来自分类Dev

ansible - json_query 将布尔值与外部变量进行比较

Related 相关文章

  1. 1

    为什么不仅仅将哈希函数迭代10,000,000次?

  2. 2

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

  3. 3

    Lua:尝试将布尔值与数字进行比较

  4. 4

    为什么python创建返回值的新副本而不仅仅是多处理中的引用

  5. 5

    为什么接口IEnumerable返回IEnumerator GetEnumemrator()?为什么不仅仅实现IEnumerator接口呢?

  6. 6

    为什么Finatra为什么使用flatMap而不仅仅是地图?

  7. 7

    为什么将参数解析为布尔值?

  8. 8

    为什么Ajax.ActionLink会更新整个页面,而不仅仅是UpdateTarget

  9. 9

    为什么是xmlns:xsi,而不仅仅是XML文档中的xsi?

  10. 10

    为什么我应该监视流程,而不仅仅是链接和陷阱出口?

  11. 11

    反应本机| 为什么我的函数立即运行,而不仅仅是onPress?

  12. 12

    为什么获取会返回“ TypeError:无法获取”,而不仅仅是“无法获取”?

  13. 13

    为什么我整个div都是可点击的,而不仅仅是链接?

  14. 14

    为什么要使用延迟变量/计算属性,而不仅仅是方法

  15. 15

    为什么需要使用Flask扩展,而不仅仅是裸库?

  16. 16

    Flink,为什么 CoMap 返回“DataStream with Product with Serializable”而不仅仅是 DataStream?

  17. 17

    为什么要实现 Comparator<t> 而不仅仅是 Comparator

  18. 18

    为什么这个 SUM 是所有分数,而不仅仅是最好的 5 分?

  19. 19

    为什么需要使用 new Random() 而不仅仅是 Random Randomnum?

  20. 20

    为什么Pytorch Dropout层会影响所有值,而不仅仅是设置为零的那些值?

  21. 21

    Php:为什么我的代码会回显表中的所有值,而不仅仅是这些值的一个子集?

  22. 22

    比较布尔值

  23. 23

    如果键已经存在,为什么stl map插入另一个值,而不仅仅是更改它?

  24. 24

    为什么整个列的值在每次迭代后都会改变,而不仅仅是一个特定的单元格?

  25. 25

    为什么我要快速创建单例,而不仅仅是将函数转储到文件中?

  26. 26

    为什么说布尔值给定

  27. 27

    为什么地图助手扩展哈希图会很有用?为什么不仅仅使用hashmap?

  28. 28

    将字符串转换为布尔值并与 js 中的 if 条件进行比较

  29. 29

    ansible - json_query 将布尔值与外部变量进行比较

热门标签

归档