C++ - Bool 到 int 转换错误

标签 c++ gcc c++17

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

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/

相关文章:

c++ - 对 DLL 中的非导出类进行单元测试

c++ - 在 C++ 源代码中检测相同名称的枚举和#define 的定义

c - 通过将 char 转换为 USHORT 得到错误的 UTF-8 值

c++ - 是否有预处理器宏来防止其他人在 C++ 中包含私有(private) header ?

c++ - Constexpr 如果使用非模板类型

从文本文件读取时 C++ 程序崩溃?

c++ - QWebSocket Hello World示例

c - & 运算符在函数指针赋值中可选

c - C库中的函数数量

c++ - 基于方法或自由函数的存在的模板构造函数解析