вопрос о указателе C на логическое значение, - PullRequest
3 голосов
/ 19 сентября 2019
int bar(int *arr, size_t n)
{
    int sum = 0, i;
    for (i = n; i > 0; i--)
    {
        sum += !arr[i - 1];
    }
    return ~sum + 1;
}

Я сталкивался с этим кодом, но не совсем понял sum += !arr[i - 1];: какой эффект! (NOT) применяется к указателю массива?Кроме того, каково влияние ~ до sum?

1 Ответ

7 голосов
/ 19 сентября 2019
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)

...