sum += !arr[i - 1];
!
- это оператор Logical Negation .Это не применяется к указателю, как вы упоминаете, но к значению arr[i-1]
.Если arr[i-1] ==0
, то результат равен 1
, иначе - 0.
~sum + 1;
~
- это оператор Побитовое НЕ Он инвертирует все двоичные биты sum
,Иногда его также называют дополнением единиц
Результат ~sum +1
аналогичен получению дополнения к двум sum
, что равно отрицательному значению суммы.Если сумма равна 5
, она вернет -5
Еще несколько пояснений к логическим операторам
Когда логические операторы (логические И, ИЛИ, НЕ)применяется к переменной, она только проверяет логическое состояние переменной.т.е. это 0
или non 0
Ненулевое значение может принимать любое значение, например 5, 10, -5
и т. д.
Итак, если вы примените !0
, вы получите значение 1. Для любого другого значениянапример, !5
ответ 0. 0. 1038 *
из C99 6.5.3.5
Результат оператора логического отрицания!равно 0, если значение его операнда сравнивается с 0, 1, если значение его операнда сравнивается равным 0. Результат имеет тип int.Выражение! E эквивалентно (0 == E)