以下代码段是否可行?
bool b1 = true;
bool b2 = 1 < 2;
if (b1 == b2)
{
// do something
}
我怀疑并非所有'真实'都是平等的。
答案 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)隐式转换为true
或false
。因此,从语言的角度来看,您甚至在进行比较之前,1
和2
都没有任何痕迹。它们都变成了同一个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
是它自己的类型,有两个可能的值true
和false
。所有比较都会按照您的预期进行。所有true
布尔值都是相同的,并且与所有false
相同。确实,您评估到true
或false
的所有表达都不一样。
在C89中,要尽可能地返回,任何零值(任何指针或数字类型)都为false,其他任何条件都为真。这意味着真实值不一定彼此相等。 1
和2
是真值,但1 != 2
和1 & 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 = 0
,scaleRatioA = 0
,scaleRatioB = 0
,isParallel2 = true
和isParallel1 = true
。尽管如此,该陈述的评估结果为true
,唯一的方法就是isParallel2
不等于isParallel1
。
没有使用任何奇特的方法来设置isParallel1
或isParallel2
的值。它们的值由_isParallel = true;
之类的语句设置。稍后,使用isParallel1 = geom1->IsParallel();
等语句将该值复制到另一个变量,该语句实现为return _isParallel;
。
我的结论是,根据编译器的不同,两个布尔变量无法可靠地进行相等性比较。我正在使用Microsoft Visual C ++ 2005,版本8.0.50727.4039。
结语:我将代码中的布尔比较替换为表达式((isParallel1 && !isParallel2) || (!isParallel1 && isParallel2))
,现在一切正常。