将函数的整数返回值与 C++ 中的布尔值进行比较

Comparing the integer return value of a function to bool in C++

本文关键字:布尔值 比较 函数 整数 返回值 C++      更新时间:2023-10-16

请考虑以下C++代码片段:

...
if (false == func()) // Line #1
{
 ...
 ...
}
int func()
{
 ...
  {
     ...
     return false;
  }
 ...
 return true;
} 

在上面的代码片段中,函数 func() 的原型指示它返回一个整数。但是在函数func() 内部,它返回 falsetrue

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

我想知道这种类型的用法是否有任何问题。如果有问题,建议需要做什么整改。

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

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

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

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

bool func();

从标准

4.7 积分转换

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

4.12 布尔转换 [conv.bool]

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

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

在比较中,常量false将转换为 int ,值0

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

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

在"积分转换">

和"布尔转换"部分中查看此网站。

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