当返回一个布尔值时,为什么要使用 " !!" ?

3

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

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

我想不出在这种情况下直接返回fBar和返回!!fBar有什么区别。两个否定词如何产生差异呢?
谢谢

4
这句话的意思是"它与return fBar;完全等价,除了混淆外没有任何作用。" - GManNickG
1
fBar更改为任何整数类型(intchar等)。现在考虑语言以及!!intVarintVar的不同之处。你的例子是无意义的。我所描述的实际应用并不罕见。根据您的右值(FALSE),您正在Windows上查看此代码,其中BOOLint,工程师经常使用此方法来消除编译器警告。 - WhozCraig
具体来说,在Windows上,通常会避免在http://msdn.microsoft.com/en-us/library/b6801kcy%28v=vs.71%29.aspx中描述的警告。 - Tony Delroy
1
它真的是 bool fBar = FALSE 而不是 BOOL fBar = FALSE 吗? - AnT stands with Russia
3个回答

7
在你的示例中,返回fBar和返回!!fBar没有区别。
在其他情况下,例如当使用用户定义类型(例如BOOLtypedefint)时,!!构造的作用是将任何非零值强制转换为true;即!!fBar等效于fBar ? true : false。如果fBar可以是5,并且您想将其与TRUE(定义为(BOOL)1)进行比较,则会产生差异。

据我上次检查,它相当于(int)(fBar ? 1: 0)。第一个!将结果从整数转换为布尔值并对其取反。第二个!再次对其取反。但是,此时您已经有了一个布尔类型的结果,您正在尝试将其分配给非布尔变量。因此,bool被提升为整数类型。bool可以是truefalse。当提升时,true变为1,false变为0。但是,true/false的值是未知的。 - SigTerm
1
!! 构造的作用是将任何非零值强制转换为 1;即 !!fBar 等效于 fBar ? 1 : 0。但这是错误的描述…… ! 是一个布尔运算符,所以无论有一个或两个 !,它始终返回 truefalse 而不是 10。 如果有的话,!!fBar 类似于 bool(fBar) - Tony Delroy

3
这通常是为了避免编译器警告,当非布尔值必须转换为bool类型时。一些编译器(如MSVC ++)在非布尔值隐式转换为bool时会发出“性能”警告。抑制此警告的一种方法是使用显式转换。另一种方法是使用!!组合。

然而,在您的情况下,return的参数已经声明为bool,这意味着上述推理不适用。(您确定它是bool而不是例如BOOL吗?)。在这种情况下,那个!!没有任何有意义的解释。


0

!!是一个“转换为布尔值”的运算符(实际上,它是两个取反运算符)。在这种情况下,它并没有什么不同。但是,如果不是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
}

1
没有“转换为布尔值”的运算符!!。不要发布可能会让人困惑的内容。 - SigTerm
2
b = !!fBar; // 这是真的:没错。但是 b = fBar; 也会将 b 设置为 true。 - Pete Becker
@BryanChen - 当然,如果代码不同,答案可能会有所不同。但事实并非如此,所以也并不是这样。 - Pete Becker
1
@BryanChen - 那我不明白你的“例如”。我以为你的代码应该是将!!应用于不是bool的东西的示例,我的观点是它在那里也不需要。 - Pete Becker
1
处理多个表示为真的值的另一种方法是不测试真(也不定义名称为任何真变体的值)。编写测试假的条件语句。 - Pete Becker
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接