Каково использование "!!" (отрицание дважды)?

Возможный дубликат:
Двойное отрицание в коде С++

Скажем:

bool var = !!true;

Он присваивает переменную "true". Кажется бесполезным, но я смотрел на определение Visual Studio "assert", и это:

#define assert(_Expression) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )

Почему это дважды отменяет "_Expression"?

Интересно, что они хотят заставить "!" вызываемый оператор (в случае перегрузки), но это, по-видимому, не является веской причиной.

Ответы

Ответ 1

!! гарантирует, что результат будет равен 1 или 0, а не только значению _Expression или 0. В C это вряд ли имеет значение, но на С++ я думаю, что он превращает результат выражение в тип bool, что может быть полезно в некоторых случаях. Если у вас есть некоторый API, для которого требуется передать литерал 1 или 0, использование !! было бы способом сделать это.

Ответ 2

Возможно, чтобы вы могли иметь переменную int, которая либо 1, либо 0.

Поэтому вы не можете, например, передать a 5, вместо этого двойное отрицание превратит это 5 в 1.

Кроме того, посмотрите, как определяется TRUE:

#ifndef TRUE
#define TRUE                1
#endif

Следовательно, выражение типа:

int x = 5;
if ( x == TRUE )
{
   //....
}

не пройдет, тогда как

if ( x )
{
   //....
}

будет.

Ответ 3

Его использование состоит в том, чтобы убедиться, что значение равно либо 0, либо 1. Я думаю, что это лишний с типом b ++ типа С++.