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

Зачем использовать два '!' операторов по логическому значению?

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

Когда я просмотрел исходный код Webkit, я нашел странное использование логического оператора "not" !:

BOOL enabled;
if (SUCCEEDED(sharedPreferences->continuousSpellCheckingEnabled(&enabled)))
    continuousSpellCheckingEnabled = !!enabled;
if (SUCCEEDED(sharedPreferences->grammarCheckingEnabled(&enabled)))
    grammarCheckingEnabled = !!enabled;

Почему они не используют enabled непосредственно вместо !!enabled?

4b9b3361

Ответ 1

Это трюк С++ для преобразования чего-либо в 1 или 0.

Например, 42 логически true, но не 1, поэтому, применяя к нему !!, вы превращаете его в 1.

Ответ 2

Это означает, что значение value должно быть логическим. Поэтому, если значение что-то оценивает, вы получите правду.

Ответ 3

Он заставляет истинное значение быть ровно 1.

В булевом контексте (if (x), while (x), x ? a : b, for (; x; )) значение 0 означает false, а любое другое значение означает true.

Если ваша функция принимает значение истины, но вам нужно ровно 1, !! в порядке.

Другими словами, !!x совпадает с x ? 1 : 0.

Ответ 4

Скорее всего, durationSpellCheckingEnabled имеет тип bool. BOOL определяется как int, поэтому:

continuousSpellCheckingEnabled = enabled;

выдает предупреждение, а:

continuousSpellCheckingEnabled = !!enabled;

нет.

Ответ 5

почему они не используют "enabled"

Двойное отрицание отменяется только для булевых значений (0 и 1), поэтому !!(0) == 0 для небулевых значений значение будет преобразовано в boolean !!(100) == 1