Подтвердить что ты не робот

Смущенный использованием двойного логического оператора (!!)

У меня есть код на С++, который широко использует !!. Я немного озадачен, потому что, насколько мне известно, !! не является оператором на нем, а двумя ! после друг друга. Таким образом, это означает, что !!foo совпадает с foo.

Есть ли место или причина, когда !! имеет смысл? Я думал о том, может ли это иметь немного мудрый смысл? Итак, сначала выполните некоторую битовую операцию на foo, а затем ! на результат? Но, похоже, я не помню, как ! использовался как немного мудрый оператор и, похоже, не нашел ссылок, говорящих, что это так. Насколько я могу сказать ! только в качестве логического оператора и в этом случае

!!foo == foo

4b9b3361

Ответ 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.