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

关于布尔值上的C指针的问题,,c,boolean,unary-function,C,Boolean,Unary Function,我遇到过这段代码,但不太懂sum+=!arr[i-1]:它的效果是什么!(未)应用于数组的指针?另外,~beforesum的效果如何 int bar(int *arr, size_t n) { int sum = 0, i; for (i = n; i > 0; i--) { sum += !arr[i - 1]; } return ~sum + 1; } 是逻辑求反运算符。它不适用于您提到的指针,而是应用于值arr[i-1]。如果

我遇到过这段代码,但不太懂
sum+=!arr[i-1]:它的效果是什么!(未)应用于数组的指针?另外,~before
sum
的效果如何

int bar(int *arr, size_t n)
{
    int sum = 0, i;
    for (i = n; i > 0; i--)
    {
        sum += !arr[i - 1];
    }
    return ~sum + 1;
}
是逻辑求反运算符。它不适用于您提到的指针,而是应用于值
arr[i-1]
。如果
arr[i-1]==0
则结果为
1
,否则结果为0

sum += !arr[i - 1];
~
按位NOT运算符它将反转
和的所有二进制位
。有时也被称为补语

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

关于逻辑运算符的更多解释

当逻辑运算符(逻辑AND、OR、NOT)应用于变量时,它只检查变量的逻辑状态。i、 e.这是无论是
0
还是
非0
非零都可以取任何值,例如
5、10、-5

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

从C99 6.5.3.5

逻辑求反运算符的结果!如果其操作数的值比较不等于0,则为0;如果其操作数的值比较等于0,则为1。结果的类型为int。表达式为!E等于(0==E)


在这条线上!arr[i-1],所以!如果arr[i-1]==0,操作员将结果变为1?你能再详细一点吗?
~sum + 1;