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

izj3ouym  于 5个月前  发布在  其他
关注(0)|答案(9)|浏览(89)

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

bool Foo() {
  // ...
}

// vs.

int Foo() {
  // ...
}

字符串
这两个功能之间有什么明显的区别吗?它们都有哪些潜在的缺陷和优点?

wf82jlnq

wf82jlnq1#

如果它是一个真正的真值,那么你应该使用一个bool,因为它可以让调用者非常清楚地知道将返回什么。当返回一个int时,它可以被视为一个code/enum类型的值。
无论是函数名、参数名和类型,还是返回代码的类型,代码都应该尽可能清晰明了。这提供了更多的自文档化代码,更容易维护的代码,以及更低的可能性,有人会误解你的“意思”。

5rgfhyps

5rgfhyps2#

有一点在现有的答案中没有得到足够的强调:当然可以使用bool,但是为了获得最大的好处,你必须为你的bool变量和函数使用好的名字。我提到这个是因为truthValue是一个典型的糟糕的名字。你的bool名字应该总是让你使用的约定很明显。不要让其他编码人员猜测bool变量的工作方式。所以;
好名字

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

字符串
恶名市场

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


你看到区别了吗?诚然,你的truthValue比status或result更好,但基本上,坏的名字会让代码混乱;

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

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

alen0pnh

alen0pnh3#

如果你想返回一个二进制真值,那么你应该在可用的地方使用布尔数据类型。
如果需要的话,开发人员会进行优化,你应该尽可能多地编写代码,这样,你或你的继任者就可以毫无疑问地在五年内完成预期的目标。

uz75evzq

uz75evzq4#

使用bool--它更清楚地传达了代码的语义。如果另一个开发人员读了你的代码,看到返回类型为bool,他会立即理解它返回了一个真值。如果他看到它返回了一个int,他不得不进一步挖掘并花费更多的时间来弄清楚函数的接口(例如,阅读文档或阅读代码),这会减慢他的速度。
使用int的唯一原因是,如果你需要与遗留代码接口和/或符合特定的接口(例如,你的函数获取其地址并传递给第三方库,该库需要某个原型的函数)。

nnt7mjpx

nnt7mjpx5#

使用bool的最大优势是语义。如果我看到一个返回bool的函数,我知道它只会返回true或false,甚至不用看或想太多关于函数的名称。如果它返回一个int,我必须更努力地思考,仔细观察函数。
当你使用它的时候(也就是说,使用bool作为返回值),也要用一种方式来命名你的bool返回函数,这种方式使得true和false作为返回值的含义变得明显。

6bc51xsx

6bc51xsx6#

有几个注意事项:如果Foo是可以从C调用的,那么你不能返回bool,因为C不知道bool是什么。
int也可以返回truefalse以外的值。这是好事还是坏事取决于Foo是否可以有其他有意义的返回值。然而,如果可以,Foo返回enum值而不是int可能更有意义。
如果你不需要与C兼容,我建议你使用bool

ftf50wuq

ftf50wuq7#

Re:陷阱。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-bool“规范化”为TRUE

  1. C++中专用bool类型的发明
    使用bool。
oo7oh9g9

oo7oh9g98#

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

uidvcgyl

uidvcgyl9#

如果truthValue是bool,则返回bool。
这可以防止类型强制(没什么大不了的)。
另一个原因是传统上返回一个int来报告状态,其中0表示成功,非零数字表示错误条件。因此,从调用者的Angular 来看,以下内容可能是不直观的:

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;
}


所以main是:

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


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


所以main是:

int main()
{ return process(); }

相关问题