gpt4 book ai didi

C++ - Bool 到 int 转换错误

转载 作者:太空狗 更新时间:2023-10-29 21:11:02 25 4
gpt4 key购买 nike

我的代码中有一个看起来像这样的函数:

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。调试器还分别显示 true255。当这个错误发生时,它总是在那个执行中发生。重新编译代码没有效果,它仍然随机发生。

最佳答案

根据 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 to false; any other value is converted to true. For direct-initialization (11.6), a prvalue of type std::nullptr_t can be converted to a prvalue of type bool; the resulting value is false.

保证 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com