返回布尔值时,为什么要使用“!!”

时间:2013-11-06 00:23:44

标签: c++ visual-c++ boolean

我看到了一些像这样的C ++代码:

bool MyProject::boo(...)
{
  bool fBar = FALSE;
  ....
  return !!fBar;
}

我想不出在这种情况下直接返回fBar和返回!!fBar之间的任何区别。两个否定因素如何产生影响?

谢谢

3 个答案:

答案 0 :(得分:7)

在您的示例中,返回fBar和返回!!fBar之间没有区别。

在其他情况下,例如当使用用户定义的类型(例如BOOLtypedef - 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
}