Каково использование "!!" (отрицание дважды)?
Возможный дубликат:
Двойное отрицание в коде С++
Скажем:
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 ++ типа С++.