我有这个类有私有bool成员变量call positive。我想查看我的课程和我添加的数字是否都是正数所以我写了表达式
positive == (n > 0) //n is of type int
但由于某种原因,当两者都是正面时,这评估为假。然后我做了一个积极的cout,它的值为204!我虽然布尔只保留1或0.这就是为什么这是评估为假,但为什么这样,我该如何解决它?我正在使用Visual Studio 2013。
只是为了澄清它应该是==因为我想知道标志是否相同。所以如果两者都是消极的,或者两者都是正面的,我希望它是真的。我想我解决了一个特定测试用例中没有初始化的问题。但仍然为什么bool变量即使未初始化包含一个更大的值和1?
答案 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)?
很抱歉提出旧问题,现在正面临问题。无法添加评论,因此请在答案部分中撰写。请帮忙。