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

When returning a boolean, why use "!!"

本文关键字:为什么 布尔值 返回      更新时间:2023-10-16

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

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

我想不出在这种情况下直接返回fBar和返回!!fBar之间有什么区别。两个负面因素如何发挥作用?

谢谢

在您的

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

在其他情况下,例如当使用用户定义的类型如BOOLtypedef-ed to be int)时,!!构造具有强制任何非零值true的效果;即 !!fBar相当于fBar ? true : false。如果fBar可以是 5,并且您想将其与定义为 (BOOL)1TRUE 进行比较,这可能会有所不同。

这样做通常是为了避免在必须将非布尔值转换为bool类型的情况下出现编译器警告。某些编译器(如 MSVC++)在将非布尔值隐式转换为 bool 时发出"性能"警告。禁止显示此警告的一种方法是使用显式转换。另一种方法是使用!!组合。

但是,在您的情况下,return的论点已经声明为bool,这意味着上述推理不适用。(你确定它是bool而不是,比如说,BOOL?在这种情况下,该!!没有有意义的解释。

!!"

is"到布尔"运算符(不是真的,它是两个否定运算符)。这种情况没有什么不同。但是,如果不bool,则会有所不同。

例如

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
}