C++ 为什么不';t bools只比最后一点?

C++ 为什么不';t bools只比最后一点?,c++,boolean,bit,C++,Boolean,Bit,最近在工作中使用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

最近在工作中使用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;
        }
    }
}
首先,这是有道理的,你和UB一起玩,你得到了你应得的。我知道解决这个问题的简单方法是“做一个好的程序员,总是初始化变量”,但对我来说,显示的行为会使调试变得更困难,因为如果前两个都是,那么第三个if总是正确的,不管布尔变量的状态是否初始化。用int来代替BooS运行示例代码对我来说是完全正确的——如果C++将0作为代码> false <代码>,并且其他任何东西都是<代码>真的<代码>,检查<代码>中的int >如果(某个int)< /C>会检查非零个数,然后比较它们将比较实际的数字。 但对于bools,我希望比较“函数”只在两种状态之间进行检查——通过比较字节的最后一位来检查true和false,而不是在255种可能的状态之间比较所有八种状态

所以我的问题是:

为什么C++比较布尔时,比较整个字节,而不是只包含真/假信息的最后一个比特。< /P>
一句话:效率。比较两个字节所需的机器代码指令比比较两个位所需的机器代码指令少,因为在后一种情况下,需要额外的掩码指令


请参见锁销上的示例:

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


参见GooBoosid:/P>使用未初始化的值导致C++中未定义的行为。如果正确使用,所有布尔变量可能只有两个值表示

true
false
。整数将通过标准布尔转换转换为两个容许值之一(参见4.12[conv.bool])。因此,无需检查所有255个可能的值。请参阅相关问题:仅比较两个值通常比屏蔽位并进行比较便宜。在有效C++代码中,结果是相同的:两个代码>布尔O/Cuth>值比较相等。一旦你进入了一个没有定义行为的领域,代码就没有任何有意义的结果,因此编译器生成次优代码也没有必要考虑它。而且这会让布尔逻辑比现在更糟糕:图像你没有指定3和7,而是指定3和4。现在这两个都是真的,但是-根据你提出的逻辑-它们不相等,因为最后一位不相等。但对我来说,显示的行为使调试更困难-更新测试套件以包括静态分析器来检测未初始化的变量,或者如果你的编译器足够聪明,可以警告你,不要扔掉这些警告。在我的计算机上崩溃,出现
运行时错误:加载值3,对于类型“bool”
,该值无效。使用未初始化的值导致C++中未定义的行为。如果正确使用,所有布尔变量可能只有两个值表示
true
false
。整数将通过标准布尔转换转换为两个容许值之一(参见4.12[conv.bool])。因此,无需检查所有255个可能的值。请参阅相关问题:仅比较两个值通常比屏蔽位并进行比较便宜。在有效C++代码中,结果是相同的:两个代码>布尔O/Cuth>值比较相等。一旦你进入了一个没有定义行为的领域,代码就没有任何有意义的结果,因此编译器生成次优代码也没有必要考虑它。而且这会让布尔逻辑比现在更糟糕:图像你没有指定3和7,而是指定3和4。现在这两个都是真的,但是-根据你提出的逻辑-它们不相等,因为最后一位不相等。但对我来说,显示的行为使调试更困难-更新测试套件以包括静态分析器来检测未初始化的变量,或者如果你的编译器足够聪明,可以警告你,不要扔掉这些警告。在我的计算机上崩溃,出现
运行时错误:加载值3,对于类型“bool”
,该值无效。讨厌的未定义的行为。
You are a good programmer!
b1 is true.
b2 is true. 
b1 != b2