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

Nig*_* Ng 3 c boolean unary-function

int bar(int *arr, size_t n)
{
    int sum = 0, i;
    for (i = n; i > 0; i--)
    {
        sum += !arr[i - 1];
    }
    return ~sum + 1;
}
Run Code Online (Sandbox Code Playgroud)

我看过这段代码,但不太明白sum += !arr[i - 1];:!(NOT)应用于数组指针的作用是什么?另外,〜之前有sum什么作用?

Ris*_*aje 7

sum += !arr[i - 1];
Run Code Online (Sandbox Code Playgroud)

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

~sum + 1;
Run Code Online (Sandbox Code Playgroud)

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

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

关于逻辑运算符的更多说明

将逻辑运算符(逻辑AND,OR,NOT)应用于变量时,它仅检查变量的逻辑状态。即这是这是否是0non 0不为零可以采取任何值,例如,5, 10, -5等等。

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

从C99 6.5.3.5

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