可以用C ++比较两个布尔值吗?

时间:2010-02-03 13:42:26

标签: c++ comparison boolean

以下代码段是否可行?

bool b1 = true;
bool b2 = 1 < 2;
if (b1 == b2)
{
// do something
}

我怀疑并非所有'真实'都是平等的。

8 个答案:

答案 0 :(得分:18)

是。所有的真理都是平等的。

答案 1 :(得分:11)

是的,布尔值只能存储true或false,您可以比较相等的值。

但是,某些错误使用的bool变量会导致“未定义”行为,并且可能看起来既不是真也不是假。例如,从整数中读取未初始化的自动变量或直接内存副本的值。

看一下以下(坏)示例:

  bool b1 = true; 
  bool b2 = true; 
  *((char*)&b1) = 3;

  if( b1 ) cout << "b1 is true" << endl;
  if( b2 ) cout << "b2 is true" << endl;
  if (b1 != b2) cout << "b2 is not equal to b1" << endl;

在Visual Studio 9上,它显示:

  

b1是真的

     

b2是真的

     

b2不等于b1

可能是因为编译器直接比较了存储的值。

答案 2 :(得分:7)

是的,正如其他人所说,可以比较bools在C ++中的相等性。您可能正在考虑从C中听到的事情。由于C没有bool类型,因此布尔值表示为整数。在布尔上下文中,任何非零整数都为真。但是,它们可能具有不同的位模式,因此不相等。所以C中的规则并不是要比较'布尔人'。

编辑:根据评论,C99有一个bool类型。然而,答案的重点是指出为什么不比较bool的想法是浮动的。它基于C的长期历史,在C99之前。

答案 3 :(得分:2)

当您为布尔对象指定一个整数值(或使用整数值初始化布尔对象)时,它会通过标准布尔转换(4.12)隐式转换为truefalse。因此,从语言的角度来看,您甚至在进行比较之前,12都没有任何痕迹。它们都变成了同一个true。这里没有“所有真理相等”的问题。只有一个true

当然,一些编译器可能采取“懒惰”的方法并保持多个不同的“真实”,确保它们在比较的时刻“完全相同”,但我怀疑这是合理的/可行的方法。

换句话说,在合理的实施中,你应该期望不仅你的比较成立,而且更强的比较也是如此:

bool b1 = true; 
bool b2 = 1 < 2;
if (memcmp(&b1, &b2, sizeof(bool)) == 0) {
  /* We should get in here */
}

语言无法保证这一点,但在现实生活中,它确实很好地描述了情况的物理方面。

答案 4 :(得分:1)

在带有int的C中你可能有一个观点(尽管我认为这个特定的序列也可以)。在C ++中,是的,这是安全的。

答案 5 :(得分:1)

在C ++中,bool是它自己的类型,有两个可能的值truefalse。所有比较都会按照您的预期进行。所有true布尔值都是相同的,并且与所有false相同。确实,您评估到truefalse的所有表达都不一样。

在C89中,要尽可能地返回,任何零值(任何指针或数字类型)都为false,其他任何条件都为真。这意味着真实值不一定彼此相等。 12是真值,但1 != 21 & 2的计算结果为0,这是假的。

C89假值也可能无法比较相同,尽管它们将用于我曾经使用的每个实现。空指针值是对指针值的常量整数零转换。对于指针值,非常量值0转换为空指针可能不是空指针(并且存在空指针不是所有位0的系统)。因此,(void *)0是空指针值,因此为false,但int i;...i = 0;...(void *)i可能不是空指针值,因此不是false。

但是,在C89中,所有打算返回布尔值的操作(例如&&==)将返回1或0,因此(1 == 3) == (4 ==3)。< / p>

答案 6 :(得分:0)

问题是只有当你习惯了非零为真时才忘记并非所有非零都是相等的。

想象一下:

你有一个函数keyPressed(),按下没有按键时返回0,按下按键时按键数。

你在一个循环中写了一个简单的开关:

if(keyPressed() && allow)
...

现在您的公司在设备中引入了常开触发器,您需要一个pref。

bool key_switches_on = getPref("KeySwitchesOn");

if((keyPressed() && allow) == key_switches_on)
...

然后你注意到“允许”错误...

if((keyPressed() == key_switches_on) && allow)

突然只有1号钥匙有效。

答案 7 :(得分:0)

我一直在阅读所有这些答案,关于为什么true为真,以及为什么可以使用==!=比较两个布尔变量,除非在极少数情况下整数被强制为bool或某些这样的事情。但是,我遇到了与原始海报完全相同的问题。我有两个布尔变量,每个都是'true',但是当我比较它们时,我发现它们不相等。这是代码行,

if (angDegDiff > 15 || scaleRatioA > 5 || scaleRatioB < -5 || (isParallel2 != isParallel1)) { return false; }

在我的示例中,angDegDiff = 0scaleRatioA = 0scaleRatioB = 0isParallel2 = trueisParallel1 = true。尽管如此,该陈述的评估结果为true,唯一的方法就是isParallel2不等于isParallel1

没有使用任何奇特的方法来设置isParallel1isParallel2的值。它们的值由_isParallel = true;之类的语句设置。稍后,使用isParallel1 = geom1->IsParallel();等语句将该值复制到另一个变量,该语句实现为return _isParallel;

我的结论是,根据编译器的不同,两个布尔变量无法可靠地进行相等性比较。我正在使用Microsoft Visual C ++ 2005,版本8.0.50727.4039。

结语:我将代码中的布尔比较替换为表达式((isParallel1 && !isParallel2) || (!isParallel1 && isParallel2)),现在一切正常。