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] ==0
1
~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)