двойное отрицание для проверки против 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;