【问题标题】:Comparing the integer return value of a function to bool in C++将函数的整数返回值与 C++ 中的 bool 进行比较
【发布时间】:2013-06-29 09:46:26
【问题描述】:

考虑下面的 C++ 代码 sn-p:

...

if (false == func()) // Line #1
{
 ...
 ...
}

int func()
{
 ...
  {
     ...
     return false;
  }
 ...

 return true;
} 

在上面的代码sn-p中,函数func()的原型表示它返回一个整数。但在函数func() 内部,它返回falsetrue

同样在第 1 行中,函数 func() 的返回值会根据布尔值进行检查。

我想知道这种用法是否有任何问题。如果有问题,建议需要整改的地方。

【问题讨论】:

  • 所有非零值都被认为是真,0是唯一的假值。
  • 为什么不把func()的返回类型也改成bool!
  • 如果我是你,我宁愿使用真正的类型。您发布的代码虽然可以正常工作,但可能会使其他程序员感到困惑

标签: c++ function boolean return-value


【解决方案1】:

没有问题,任何非零整数都转换为true,零为false。相反,bool 可以转换为inttrue 可以转换为1false 可以转换为0

不过,在比较布尔值时,您不需要那么冗长:

if (!func()) { .... }

当然,如果函数只返回truefalse,如您的示例,那么直接返回bool 是有意义的:

bool func();

【讨论】:

    【解决方案2】:

    来自标准

    4.7 积分转换

    如果目标类型是 bool,请参见 4.12。如果源类型为 bool,则值 false 被转换为零并且 值 true 转换为 1。

    4.12 布尔转换 [conv.bool]

    算术、无范围枚举、指针或指向成员类型的指针的纯右值可以转换为 bool 类型的纯右值。将零值、空指针值或空成员指针值转换为 false; 任何其他值都将转换为 true。 std::nullptr_t 类型的纯右值可以转换为 类型布尔;结果是假的。

    【讨论】:

      【解决方案3】:

      函数func()中,源类型是bool,目的类型是int(因为函数的返回类型是int),所以值false被转换为零,值true被转换为值目的地类型之一。当返回到第 1 行时,这个 int 会自动转换为 bool,因此,由于 func 可以返回 1 或 0,因此值 0 变为 false,1 变为 true。如果 func 返回任何非零值,它将在第 1 行自动转换为 true。

      检查“积分转换”和“布尔转换”部分中的this website

      Sureley 这种用法没有问题,但我必须说它不容易阅读,特别是如果代码变得更复杂并且应该由没有编写此代码的其他人维护。为什么不简单地让 func 返回 bool?

      【讨论】:

        【解决方案4】:

        func 内部,您提供的bool 将转换为int 以返回。 false 转换为0true 转换为1

        在比较中,您的常量false 被转换为int,值为0

        通常,如果您选择一个代码,您的代码会更好地阅读:要么始终使用 bool 类型,要么使用 int 类型和值 0

        【讨论】:

          猜你喜欢
          • 2014-10-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多