我看到了一些像这样的C++代码:
bool MyProject::boo(...)
{
bool fBar = FALSE;
....
return !!fBar;
}
我想不出在这种情况下直接返回
fBar
和返回!!fBar
有什么区别。两个否定词如何产生差异呢?谢谢
我看到了一些像这样的C++代码:
bool MyProject::boo(...)
{
bool fBar = FALSE;
....
return !!fBar;
}
fBar
和返回!!fBar
有什么区别。两个否定词如何产生差异呢?fBar
和返回!!fBar
没有区别。BOOL
,typedef
为int
)时,!!
构造的作用是将任何非零值强制转换为true
;即!!fBar
等效于fBar ? true : false
。如果fBar
可以是5,并且您想将其与TRUE
(定义为(BOOL)1
)进行比较,则会产生差异。(int)(fBar ? 1: 0)
。第一个!
将结果从整数转换为布尔值并对其取反。第二个!
再次对其取反。但是,此时您已经有了一个布尔类型的结果,您正在尝试将其分配给非布尔变量。因此,bool
被提升为整数类型。bool
可以是true
或false
。当提升时,true
变为1,false
变为0。但是,true
/false
的值是未知的。 - SigTerm!
是一个布尔运算符,所以无论有一个或两个 !
,它始终返回 true
或 false
而不是 1
或 0
。 如果有的话,!!fBar
类似于 bool(fBar)
。 - Tony Delroybool
类型时。一些编译器(如MSVC ++)在非布尔值隐式转换为bool
时会发出“性能”警告。抑制此警告的一种方法是使用显式转换。另一种方法是使用!!
组合。
然而,在您的情况下,return
的参数已经声明为bool
,这意味着上述推理不适用。(您确定它是bool
而不是例如BOOL
吗?)。在这种情况下,那个!!
没有任何有意义的解释。
!!
是一个“转换为布尔值”的运算符(实际上,它是两个取反运算符)。在这种情况下,它并没有什么不同。但是,如果不是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
}
!!
。不要发布可能会让人困惑的内容。 - SigTerm!!
应用于不是bool
的东西的示例,我的观点是它在那里也不需要。 - Pete Becker
return fBar;
完全等价,除了混淆外没有任何作用。" - GManNickGfBar
更改为任何整数类型(int
,char
等)。现在考虑语言以及!!intVar
与intVar
的不同之处。你的例子是无意义的。我所描述的实际应用并不罕见。根据您的右值(FALSE
),您正在Windows上查看此代码,其中BOOL
是int
,工程师经常使用此方法来消除编译器警告。 - WhozCraigbool fBar = FALSE
而不是BOOL fBar = FALSE
吗? - AnT stands with Russia