双重否定检查非NULL

double negation to check against not NULL

本文关键字:NULL 检查      更新时间:2023-10-16

我一直看到有人写这样的代码

SomeType c=....
    if(!!c)
    {
     ....
    }

在什么情况下,它与

有什么不同?
if (c)
{
   .....
}

这种做法起源于C语言。在C语言有布尔类型之前

c = 0时,!!c = 0

c任意值时,!!c始终为1

c转换为一个真正的双状态布尔值。测试像( !!bool1 == !!bool2 )( !!bool3 == TRUE )这样的表达式将得到预期的结果,即使这些值是"true"的不同位表示。

我发现在Microsoft Visual c++中产生以下警告:

int i = GetSomeValue();
bool b = (bool) i;
warning C4800: 'int' : forcing value to bool 'true' or 'false' (performance warning)

我的意图是明确的,但编译器坚持生成警告。如果我使用双重否定,那么警告就会消失。

int i = GetSomeValue();
bool b = !!i;