2014-07-09 22 views
2

我已经看到人们写代码像双重否定对证不是NULL

SomeType c=.... 

    if(!!c) 
    { 
    .... 
    } 
在什么情况下

,这将是差异从

if (c) 
{ 
    ..... 
} 
+0

当'c'不是'bool'(至少有一个“true”或“false”值)。 – chris

+1

[运算符重载](http://en.cppreference.com/w/cpp/language/operators)。 – BoBTFish

+0

所以这意味着它和if(c == true)是一样的,它也可以将c转换为bool – KKKoo0

回答

3

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

c0,!!c也是0

c任何其他值,!!c总是1

这会将c转换为真实的2态布尔值。像(!!bool1 == !!bool2)或这样的测试表达式将给出预期的结果,即使这些值是不同的按位表示“真”。

+0

C++中有必要吗? –

+1

@NeilKirk假设'operator!'没有被重载以对给定类型做一些奇怪的事情,这是没有必要的。它在功能上等同于任何对“bool”的演员。 –

0

我发现下面生成在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;