gpt4 book ai didi

c++ - 为什么不仅仅将 boolean 值进行比较?

转载 作者:行者123 更新时间:2023-12-02 09:50:53 28 4
gpt4 key购买 nike

最近,在工作中使用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一起玩,就得到了应得的。我知道一个简单的解决方案是“做一个好的程序员,并总是初始化变量”,但是对我来说,显示的行为使调试变得更加困难,因为如果前两个条件是第三个,那么无论状态如何,您都希望第三个条件总是成立。 bool(boolean) 变量是否已初始化。用int而不是bool来运行示例代码对我来说非常有意义-如果C++将0视为 false,将其他任何内容视为 true,则检查 if(some_int)中的int会检查非零数字,然后进行比较将比较实际数字。

但是对于 bool(boolean) ,我希望比较“功能”只能通过比较字节的最后一位来检查“真”和“假”两个状态,而不是在255个可能的状态之间比较所有八个状态。

所以我的问题是:

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

Minimum reproducible example

最佳答案

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

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

关于c++ - 为什么不仅仅将 boolean 值进行比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59592142/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com