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?
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?
sum += !arr[i - 1];
是逻辑否定!运算符。正如您提到的,它不是应用于指针,而是应用于 value 。如果结果为否则结果为 0。arr[i-1]arr[i-1] ==01
~sum + 1;
~是按位非运算符,它将反转 的所有二进制位sum。有时也称为补码
的结果~sum +1与取 的二进制补码相同sum,等于和的负数。如果总和是5它将返回-5
关于逻辑运算符的更多解释
当对变量应用逻辑运算符(逻辑与、或、非)时,它只检查变量的逻辑状态。即,这是0或non 0非零可以取任何值,例如5, 10, -5等。
所以,如果你申请,!0 你会得到 1 的值。对于任何其他值,例如!5答案是 0。
从 C99 6.5.3.5
逻辑否定运算符的结果!如果其操作数的值比较不等于 0,则为 0,如果其操作数的值比较等于 0,则为 1。结果的类型为 int。表达式 !E 等价于 (0==E)