奇怪的bool值

时间:2013-11-27 13:36:55

标签: c++ visual-c++ boolean

我有这个类有私有bool成员变量call positive。我想查看我的课程和我添加的数字是否都是正数所以我写了表达式

positive == (n > 0) //n is of type int

但由于某种原因,当两者都是正面时,这评估为假。然后我做了一个积极的cout,它的值为204!我虽然布尔只保留1或0.这就是为什么这是评估为假,但为什么这样,我该如何解决它?我正在使用Visual Studio 2013。

只是为了澄清它应该是==因为我想知道标志是否相同。所以如果两者都是消极的,或者两者都是正面的,我希望它是真的。我想我解决了一个特定测试用例中没有初始化的问题。但仍然为什么bool变量即使未初始化包含一个更大的值和1?

4 个答案:

答案 0 :(得分:2)

根据标准,获取未初始化变量的值是未定义的行为。 由于bool的实际大小可能超过一位,因此包含垃圾的bool变量甚至可以保存错误的值,例如254.欢迎来到C ++地狱!

由于(n> 0)的计算结果为1,254 == 1为假。

该错误很可能是由于positive从未获得有意义的值,因为包含它的对象已经存在。

在您的代码中搜索positive = something,并在使用之前查看它是否至少执行过一次。


在Konrad评论后编辑

问题很可能是因为在int-s之间实现了==而不是bool-s依赖于bool-to-int升级,假设bool的实现使用0表示false,1表示true表示(和因为&&和||在int-s之间假定0表示假,非0表示真,bool-to-int促销可以是身份)。

这可以看作是“编译器的不公平”,但是 - 因为在整数的空间中存在一个虚假和虚构的虚假 - 如果operator==(bool,bool)被应用,那么未初始化的bug就会有更多的机会。没发现。

在算术运算中处理bool为int(而非逻辑运算)会使bad-bool值出现,从而揭示错误。

当然,因为它背后有一个UB,所有这些都是一个实现选择。并且考虑到我试图将错误作为一种特征出售,这是每次阅读的自由。

答案 1 :(得分:0)

哦,你有一个==你应该有一个=。

==不分配,它检查是否相等

应该是

bool positive = (n > 0) //n is of type int
分配后,

bool通常只保留1或0。我可以想象你在bool中看到204的唯一原因是变量是否未初始化(因此它有一个垃圾值)。

答案 2 :(得分:-1)

使用布尔运算符&&

positive && (n > 0)

最后,您可以尝试!!positive == (n > 0)

答案 3 :(得分:-1)

@Emilio Garavaglia

  

在代码中搜索一个正数=某物,然后查看它是否在使用前至少执行了一次。

bool类型的类变量的默认值不是false吗?如果该语句为正=至少一次不执行某项操作,为什么它不打印bool类型的默认值0(或false)?

很抱歉提出旧问题,现在正面临问题。无法添加评论,因此请在答案部分中撰写。请帮忙。