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) 应用于数组指针的效果是什么?另外, ~ before 的作用是什么sum

4

1 回答 1

7
sum += !arr[i - 1];

逻辑否定!运算符。正如您提到的,它不是应用于指针,而是应用于 value 。如果结果为否则结果为 0。arr[i-1]arr[i-1] ==01

~sum + 1;

~按位非运算符,它将反转 的所有二进制位sum。有时也称为补码

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

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

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

所以,如果你申请,!0 你会得到 1 的值。对于任何其他值,例如!5答案是 0。

从 C99 6.5.3.5

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

于 2019-09-19T04:53:54.213 回答