Ответ 1
Это трюк С++ для преобразования чего-либо в 1
или 0
.
Например, 42
логически true
, но не 1
, поэтому, применяя к нему !!
, вы превращаете его в 1
.
Возможный дубликат:
Двойное отрицание в коде С++
Когда я просмотрел исходный код Webkit, я нашел странное использование логического оператора "not" !
:
BOOL enabled;
if (SUCCEEDED(sharedPreferences->continuousSpellCheckingEnabled(&enabled)))
continuousSpellCheckingEnabled = !!enabled;
if (SUCCEEDED(sharedPreferences->grammarCheckingEnabled(&enabled)))
grammarCheckingEnabled = !!enabled;
Почему они не используют enabled
непосредственно вместо !!enabled
?
Это трюк С++ для преобразования чего-либо в 1
или 0
.
Например, 42
логически true
, но не 1
, поэтому, применяя к нему !!
, вы превращаете его в 1
.
Это означает, что значение value должно быть логическим. Поэтому, если значение что-то оценивает, вы получите правду.
Он заставляет истинное значение быть ровно 1.
В булевом контексте (if (x)
, while (x)
, x ? a : b
, for (; x; )
) значение 0
означает false, а любое другое значение означает true.
Если ваша функция принимает значение истины, но вам нужно ровно 1, !!
в порядке.
Другими словами, !!x
совпадает с x ? 1 : 0
.
Скорее всего, durationSpellCheckingEnabled имеет тип bool. BOOL определяется как int, поэтому:
continuousSpellCheckingEnabled = enabled;
выдает предупреждение, а:
continuousSpellCheckingEnabled = !!enabled;
нет.
почему они не используют "enabled"
Двойное отрицание отменяется только для булевых значений (0 и 1), поэтому !!(0) == 0
для небулевых значений значение будет преобразовано в boolean !!(100) == 1