двойное отрицание для проверки против not NULL
Я видел людей, пишущих код, как
SomeType c=....
if(!!c)
{
....
}
В каком случае это будет отличаться от
if (c)
{
.....
}
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;