如果我有一个执行某些过程的函数然后需要返回某事的真值,那么使用布尔变量或int变量作为返回类型是否有令人信服的理由?
bool Foo()
{
...
...
return truthValue;
}
int Foo()
{
...
...
return truthValue;
}
这两个功能之间是否存在明显差异?这两者有哪些潜在的缺陷和优势?
感谢,
NMR
答案 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
也可以返回true
或false
以外的值。根据{{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,则该错误。
这导致了两件事,
只需使用bool。