Смущенный использованием двойного логического оператора (!!)
У меня есть код на С++, который широко использует !!
. Я немного озадачен, потому что, насколько мне известно, !!
не является оператором на нем, а двумя !
после друг друга. Таким образом, это означает, что !!foo
совпадает с foo
.
Есть ли место или причина, когда !!
имеет смысл? Я думал о том, может ли это иметь немного мудрый смысл? Итак, сначала выполните некоторую битовую операцию на foo
, а затем !
на результат? Но, похоже, я не помню, как !
использовался как немного мудрый оператор и, похоже, не нашел ссылок, говорящих, что это так. Насколько я могу сказать !
только в качестве логического оператора и в этом случае
!!foo == foo
Ответы
Ответ 1
Это не так просто, как двойное отрицание. Например, если у вас есть x == 5
, а затем примените два! операторов (!!x
), он станет 1 - таким образом, он используется для нормализации булевых значений в диапазоне {0, 1}
.
Обратите внимание, что вы можете использовать ноль как boolean false и non-zero для boolean true, но вам может потребоваться нормализовать ваш результат в 0 или 1, и именно тогда !!
будет полезен.
Это то же самое, что и x != 0 ? 1 : 0
.
Кроме того, обратите внимание, что это будет неверно, если foo
не находится в {0, 1}
:
!!foo == foo
#include <iostream>
using namespace std;
int main()
{
int foo = 5;
if(foo == !!foo)
{
cout << "foo == !!foo" << endl;
}
else
{
cout << "foo != !!foo" << endl;
}
return 0;
}
Печать foo != !!foo
.
Ответ 2
Его можно использовать как стенографию, чтобы превратить foo
в логическое выражение. По какой-то причине вы можете захотеть превратить небулево выражение в true или false.
foo = !!foo
собирается превратить foo
в 1
, если он отличен от нуля, и оставьте его в 0
, если он уже есть.
Ответ 3
если foo != 0
, затем !!foo == 1
. Это в основном трюк для преобразования в bool.
Ответ 4
Если foo
не имеет типа bool, тогда !!foo
будет. Таким образом, !!foo
может быть 1 или 0.
Ответ 5
Этот метод используется для безопасной оценки переменной в булевом контексте. Если у вас нормальный разговор с bool (operator bool()
), несвязанные переменные (с разными типами) могут участвовать в булевых выражениях нежелательным образом. Реализуется определение operator!
, которое возвращает отрицательное логическое значение. И его результат нужно снова отменить. Просто взгляните на безопасную идиому bool.