我应该返回 int 或 bool 作为“真值”吗?

问题描述 投票:0回答:9

如果我有一个执行某些过程然后需要返回某些内容的真值的函数,是否有令人信服的理由使用

int
bool
作为返回类型?

bool Foo() {
  // ...
}

// vs.

int Foo() {
  // ...
}

这两个功能之间有明显的区别吗?它们都有哪些潜在的陷阱和优点?

c++ boolean return-type
9个回答
32
投票

如果它是真正的真值,那么您应该使用布尔值,因为它使调用者非常清楚将返回什么。当返回 int 时,它可以被视为代码/枚举类型值。

无论是函数名、参数名和类型,还是返回码的类型,代码都应该尽可能清晰明确。这提供了更多的自记录代码,更容易维护的代码,并且有人误解您“意思”的可能性更低。


7
投票

现有答案中没有充分强调的一件事:当然使用 bool,但为了获得最大的好处,您必须为 bool 变量和函数使用好的名称。我提到这一点是因为truthValue是一个典型的可怕的名字。您的布尔名称应该始终使您使用的约定显而易见。不要让其他编码人员猜测 bool 变量的工作方式。所以;

好名字

bool okay;
bool error;
bool success;
bool IsWidget();

不好的名字

bool truthValue;
bool status;
bool result;
bool Widget();

你看到区别了吗?诚然,你的真相价值可以说比地位或结果更好。但基本上,不好的名字会导致代码混乱;

// Bad
bool result = Func();
if( result )
{
   // Did Func() succeed or fail ? who knows
}

// Good
bool okay = Func();
if( okay )
{
   // Func() succeeded
}

6
投票

如果您想返回二进制真值,那么您应该使用可用的布尔数据类型。

编译器会在必要时进行优化,您应该尽可能多地编写代码以使其清晰。这样,您或您的继任者将毫无疑问五年后会实现预期目标。


6
投票

使用

bool
——它可以更清楚地传达代码的语义。如果另一个开发人员阅读您的代码并看到返回类型为
bool
,他会立即明白它返回一个真值。相反,如果他看到它返回一个
int
,他就必须进一步挖掘并花更多时间找出函数的接口(例如阅读文档或阅读代码),这会减慢他的速度。

使用

int
的唯一原因是,如果您需要与遗留代码交互和/或符合特定接口(例如,您的函数获取其地址并将其传递给需要特定原型函数的第三方库) ).


2
投票

使用 bool 的一大优点是语义。如果我看到一个返回 bool 的函数,我知道它只会返回 true 或 false,甚至不需要仔细查看或思考函数的名称。如果它返回一个 int,我必须更加努力地思考并仔细查看该函数。

当您使用它时(也就是说,使用 bool 作为返回值),也要以这样的方式命名返回 bool 的函数,以明确 true 和 false 作为返回值的含义。思考危险:以问题的形式陈述你的函数名称。


2
投票

有几个考虑因素。如果

Foo
旨在从 C 中调用,则无法返回
bool
,因为 C 不知道
bool
是什么。

int
还可以返回
true
false
以外的值。这是好事还是坏事取决于
Foo
是否可以有其他有意义的返回值。但是,如果可以的话,Foo 返回
enum
值而不是
int
可能更有意义。

如果您没有与 C 兼容作为要求,我建议

bool


2
投票

回复:陷阱。 int-as-bool 的问题在于人们这样做的时候(有点做作,但你明白了):

typedef int BOOL
#define TRUE 1
#define FALSE 0

BOOL FDoSomething()
{
     // code code code
     return numTimesIDidSomething;
}

void Func()
{
     // code code code
     if(FDoSomething() == TRUE) // ERROR!
     {
          //etc
     }
}

如果 numTimesIDidSomething 大于 1,这是一个错误。

这会导致两件事,

  1. 要求您使用奇怪的构造(如 !!boolVariable)将所有整数“规范化”为 TRUE
  2. C++中专用bool类型的发明

只需使用布尔值即可。


1
投票

bool 曾经只是一个宏...现在编译器强制它仅具有值 0 或 1(除非它未初始化)。我肯定会使用 bool - 它是自记录的,除了 bool 之外你不需要任何东西。保持简单、具体。


0
投票

如果 trueValue 是 bool,则返回 bool。

这可以防止类型强制(没什么大不了的)。

另一个原因是,通常返回一个 int 来报告状态,其中 0 表示成功,非零数字表示错误情况。因此,从调用者的角度来看,以下内容是不直观的:

int process()
{
   bool success = false
   if (the process was successful)
      success = trrue;
   return success;
};

按照惯例,应该是其中之一

bool process()
{
   bool success = false
   if (the process was successful)
      success = true;
   return success;
}

所以主要是:

int main()
{   return process() ? EXIT_SUCCESS : EXIT_FAILURE; }

int process()
{
  int result = EXIT_FAILURE
  if (the process was successful)
    result = EXIT_SUCCESS
  return result;
};

所以主要是:

int main()
{ return process(); }
© www.soinside.com 2019 - 2024. All rights reserved.