请考虑以下C ++代码段:
...
if (false == func()) // Line #1
{
...
...
}
int func()
{
...
{
...
return false;
}
...
return true;
}
在上面的代码片段中,函数func()
的原型表明它返回一个整数。但在函数func()
中,它会返回false
或true
。
同样在第1行中,函数func()
的返回值是根据布尔值检查的。
我想知道这种用法是否有任何问题。如果有问题,建议需要进行哪些整改。
答案 0 :(得分:8)
没有问题,任何非零整数都转换为true
,零为false
。相反,bool
可以转换为int
,true
转换为1
,false
转换为0
。
在比较布尔值时,您不需要如此冗长:
if (!func()) { .... }
当然,如果该函数仅返回true
或false
,如您的示例所示,则直接返回bool
是有意义的:
bool func();
答案 1 :(得分:2)
来自标准
4.7整体转换
如果目的地类型是bool,请参阅4.12。如果源类型是bool,则值false将转换为零和 值true将转换为一个。
4.12布尔转换[conv.bool]
算术,无范围枚举,指针或指向成员类型的指针的prvalue可以转换为a bool类型的prvalue。零值,空指针值或空成员指针值转换为false; 任何其他值都转换为true。类型为std :: nullptr_t的prvalue可以转换为prvalue 类型bool;结果值为false。
答案 2 :(得分:1)
在func
内,您提供的bool
会转换为int
以便返回。 false
转换为0
,true
转换为1
。
在比较中,您的常量false
将转换为int
,其值为0
。
通常,如果您选择一个代码,您的代码会更好地阅读:要么始终使用bool
类型,要么使用int
类型和值0
。
答案 3 :(得分:0)
在函数func()中,源类型为bool,目标类型为int(因为函数的返回类型为int),因此值false将转换为零,值true将转换为值目的地类型之一。当返回到第1行时,这个int会自动转换为bool,因为func可以返回1或0,值0变为false,1变为true。如果func返回任何非零值,它将在第1行自动转换为true。
在“积分转换”和“布尔转换”部分中查看this website。
Sureley这种用法没有问题,但我必须说它不易读取,特别是如果代码变得更复杂并且应由未编写此代码的其他人维护。你为什么不简单地让func返回bool?