двойное отрицание для проверки против not NULL


Я видел людей, пишущих код, как

SomeType c=....

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

В каком случае это будет отличаться от

if (c)
{
   .....
}
2 2

2 ответа:

Эта практика берет свое начало в языке Си. Прежде чем с типа boolean.

Когда c является 0, !!c есть также 0.

Когда c является любым другим значением, !!c есть всегда 1.

Это преобразует c в истинное булево 2-го состояния. Тестовые выражения, такие как ( !!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;