我看到了一些像这样的C ++代码:
bool MyProject::boo(...)
{
bool fBar = FALSE;
....
return !!fBar;
}
我想不出在这种情况下直接返回fBar
和返回!!fBar
之间的任何区别。两个否定因素如何产生影响?
谢谢
答案 0 :(得分:7)
在您的示例中,返回fBar
和返回!!fBar
之间没有区别。
在其他情况下,例如当使用用户定义的类型(例如BOOL
(typedef
- ed为int
)时,!!
构造具有强制任何非零值的效果true
;即!!fBar
相当于fBar ? true : false
。如果fBar
可以为5,并且您希望将其与TRUE
(定义为(BOOL)1
进行比较,则会产生差异。
答案 1 :(得分:3)
这通常是为了避免在非bool值必须转换为bool
类型的情况下编译器警告。当非bool值隐式转换为bool
时,某些编译器(如MSVC ++)会发出“性能”警告。抑制此警告的一种方法是使用显式转换。另一种方法是使用!!
组合。
但是,在您的情况下,return
的参数已经声明为bool
,这意味着上述推理不适用。 (你确定它是bool
而不是BOOL
吗?)。在那种情况下,对!!
没有任何有意义的解释。
答案 2 :(得分:0)
!!
“是”到布尔“运算符(不是真的,它是两个否定运算符)。这种情况没有什么不同。但是,如果不是bool
,它会有所不同。
e.g。
int fBar = 2; // !!fBat evaluate to 1
bool b = (fBar == true) // this is false
b = fBar; // this is true
b = !!fBar; // this is also true
typedef int MyBool; // say some library use int as boolean type
#define MY_TRUE 1
#define MY_FALSE 0
MyBool b2 = fBar; // this evaluate to true, but not equal to true
if (b2 == MY_TRUE )
{
// this code will not run, unexpected
}
if (b2)
{
// this code will run
}
MyBool b3 = !!fBar;
if (b2 == MY_TRUE )
{
// this code will run
}
if (b2)
{
// this code will run
}