我的代码中有一个看起来像这样的函数:
bool foo(ObjectType& object){
//code
const float result = object.float_data + object.bool_data * integer_data;
//code
}
在查找错误时,我发现 result
有时会有不正确的值,原因是有时 bool
*integer
计算为255*integer
而不是 1*integer
。
C++ 说在整数上下文中 bool
被转换为零或一,所以我不明白这一点。我在代码的其他部分乘以 bool
并且它工作正常。这也是随机的:有时它会转换为 1
,有时会转换为 255
。调试器还分别显示 true
或 255
。当这个错误发生时,它总是在那个执行中发生。重新编译代码没有效果,它仍然随机发生。
最佳答案
根据 C++17 7.14 bool 值转换
,将非 bool 值强制转换为 bool 值是标准转换过程的一部分,这意味着它实际上是在为 bool 值赋值时完成的:
A prvalue of arithmetic, unscoped enumeration, pointer, or pointer to member type can be converted to a prvalue of type
bool
. A zero value, null pointer value, or null member pointer value is converted tofalse
; any other value is converted totrue
. For direct-initialization (11.6), a prvalue of typestd::nullptr_t
can be converted to a prvalue of typebool
; the resulting value isfalse
.
不保证 bool 值将是零或一,例如,如果您不初始化它,或者您以这样的方式初始化它它被视为非 bool 值:
void someFunction() {
bool xyzzy; // Set to some arbitrary value.
memcpy(&xyzzy, "x", 1); // Very contrived, wouldn't pass my
// own code review standards :-)
}
因此,我要查看的第一事情是确保您正确初始化/分配它。
事实上,我现在很少在没有显式初始化变量的情况下引入变量。即使稍后在使用前进行了更改,我也宁愿依靠编译器来解决这个问题,并在它认为有用的情况下进行优化。
但是您可以按预期使用 bool 值来解决这个问题。换句话说,作为真理的宝库而不是将它们作为整体值(value)来评估。试试这个:
const float result = object.float_data + (object.bool_data ? integer_data : 0);
无论 bool_data
是否为:
- 一个正确初始化的 bool 值;
- 一个未正确初始化的 bool 值(虽然你的结果会令人怀疑 - 我的意思是你永远不会得到超过一个
integer_data
添加到你的float_result
);或 - 整数值被视为为 bool 值(尽管这无论如何都是一个坏主意)。
关于C++ - Bool 到 int 转换错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51927616/