关于布尔值的 C 指针的问题,

question about C pointer on boolean value,

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之前~的作用是什么?

sum += !arr[i - 1];

! 逻辑非 运算符。它没有像您提到的那样应用于指针,而是应用于值 arr[i-1]。如果 arr[i-1] ==0 结果是 1 否则结果是 0.

~sum + 1;

~ 位非运算符 它将反转 sum 的所有二进制位。有时也称为 ones complement

~sum +1的结果与取sum的补码相同,等于sum的负数。如果总和是 5 它将 return -5

逻辑运算符的更多解释

当逻辑运算符(逻辑与、或、非)应用于变量时,它只检查变量的逻辑状态。即这是 0 还是 non 0 非零可以取任何值,例如5, 10, -5

因此,如果您应用 !0,您将获得值 1。对于任何其他值,例如!5答案是0。

来自 C99 6.5.3.5

The result of the logical negation operator ! is 0 if the value of its operand compares unequal to 0, 1 if the value of its operand compares equal to 0. The result has type int. The expression !E is equivalent to (0==E)