2

考虑下面的 C++ 代码片段:

...

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

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

 return true;
} 

在上面的代码片段中,函数的原型func()表明它返回一个整数。但在函数内部func(),它返回要么false要么true

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

我想知道这种用法是否有任何问题。如果有问题,建议需要进行哪些整改。

4

4 回答 4

8

没有问题,任何非零整数都转换为true,而零是false。相反, abool可以转换为inttrue转换为1和。false0

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

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

当然,如果函数只返回trueor false,就像你的例子一样,那么bool直接返回是有意义的:

bool func();
于 2013-07-02T06:15:13.780 回答
2

从标准

4.7 积分转换

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

4.12 布尔转换 [conv.bool]

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

于 2013-07-02T06:20:41.710 回答
1

在内部funcbool您提供的内容将转换int为退货。false转换为0true转换为1

在比较中,您的常量false将转换为int, 和 value 0

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

于 2013-07-02T07:40:47.227 回答
0

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

在“积分转换”和“布尔转换”部分查看此网站

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

于 2013-07-02T06:29:38.613 回答