我应该在C ++中使用“int”或“bool”作为返回值吗?

时间:2010-01-20 03:18:26

标签: c++

如果我有一个执行某些过程的函数然后需要返回某事的真值,那么使用布尔变量或int变量作为返回类型是否有令人信服的理由?

bool Foo()
{
  ...
  ...
  return truthValue;
}

int Foo()
{
  ...
  ...
  return truthValue;
}

这两个功能之间是否存在明显差异?这两者有哪些潜在的缺陷和优势?

感谢,

NMR

9 个答案:

答案 0 :(得分:26)

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

代码应尽可能清晰明确,无论是函数名称,参数名称和类型,还是返回代码的类型。这提供了更多自我记录的代码,更易于维护的代码,以及有人会误解您“意味着什么”的可能性较低。

答案 1 :(得分:6)

如果要返回二进制真值,则应使用布尔数据类型(

编译器会在必要时对事物进行优化,您应该尽可能地编写代码以明确。这样,你或你的继任者将毫无疑问地在轨道上走了五年。

答案 2 :(得分:5)

使用bool - 它更清楚地传达了代码的语义含义。如果另一个开发人员读取您的代码并看到返回类型bool,他立即知道它返回一个真值。相反,如果他看到它返回int,他必须进一步挖掘并花费更多时间来确定函数的界面(例如阅读文档或阅读代码),这会减慢他的速度。

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

答案 3 :(得分:4)

现有答案中没有强调的一件事:肯定使用bool,但为了获得最大的好处,你只需要为你的bool变量和函数使用好名字。我提到这个是因为truthValue是一个典型的可怕名字。您的bool名称应始终使您使用的约定显而易见。不要让其他编码器猜测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
}

答案 4 :(得分:2)

使用bool的最大优点是语义。如果我看到一个返回bool的函数,我知道它只会返回true或false,甚至没有查看或者过于强调函数的名称。如果它返回一个int,我必须更加思考并仔细观察该函数。

当你在它的时候(使用bool作为返回值,也就是这样),也可以用这样的方式命名你的bool返回函数,这样就可以明显地将true和false表示为返回值。想想危险:以问题的形式陈述您的功能名称。

答案 5 :(得分:2)

有几点需要考虑。如果Foo可以从C调用,则无法返回bool,因为C不知道bool是什么。

int也可以返回truefalse以外的值。根据{{​​1}}是否可以有其他有意义的返回值,这可能是好事还是坏事。但是,如果可以,则Foo返回Foo值而不是enum更有意义。

如果您不同意C的兼容性,我建议使用int

答案 6 :(得分:1)

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

答案 7 :(得分:0)

如果truthValue是bool return 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(); }

答案 8 :(得分:0)

回复:陷阱。 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这样的奇怪结构来“规范化”所有ints-as-bools为TRUE
  2. C ++中专用bool类型的发明
  3. 只需使用bool。