关于C语言指针和布尔值的问题

3
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
sum += !arr[i - 1];

!逻辑非运算符。它不作用于指针,而是作用于值arr[i-1]上。如果arr[i-1] ==0,结果为1,否则结果为0

~sum + 1;
~按位取反运算符。它会倒置sum的所有二进制位。有时也称为一补数运算~sum+1的结果相当于对sum取二进制补码,这等于sum的负数。如果sum5,它将返回-5
关于逻辑运算符的更多解释:
当应用逻辑运算符(逻辑与、或、非)于变量时,它只检查变量的逻辑状态。即这是0还是非 0。非零可以取任何值,如5、10、-5等。
因此,如果您应用!0,则会得到1的值。对于其他任何值,例如!5,答案都是0。
来自C99 6.5.3.5
引用:

逻辑否定运算符!的结果是0,如果其操作数的值不等于0,则为1,如果其操作数的值等于0,则为1。结果具有int类型。表达式! E等效于(0==E)


在这一行代码中,如果arr[i-1]==0,则!运算符将结果变为1。请问您能否再详细解释一下吗? - Nigel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接