关于布尔值的 C 指针的问题,
question about C pointer on boolean value,
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
之前~的作用是什么?
sum += !arr[i - 1];
!
是 逻辑非 运算符。它没有像您提到的那样应用于指针,而是应用于值 arr[i-1]
。如果 arr[i-1] ==0
结果是 1
否则结果是 0.
~sum + 1;
~
是 位非运算符 它将反转 sum
的所有二进制位。有时也称为 ones complement
~sum +1
的结果与取sum
的补码相同,等于sum的负数。如果总和是 5
它将 return -5
逻辑运算符的更多解释
当逻辑运算符(逻辑与、或、非)应用于变量时,它只检查变量的逻辑状态。即这是 0
还是 non 0
非零可以取任何值,例如5, 10, -5
等
因此,如果您应用 !0
,您将获得值 1。对于任何其他值,例如!5
答案是0。
来自 C99 6.5.3.5
The result of the logical negation operator ! is 0 if the value of its operand compares unequal to 0, 1 if the value of its operand compares equal to 0. The result has type int. The expression !E is equivalent to (0==E)
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
之前~的作用是什么?
sum += !arr[i - 1];
!
是 逻辑非 运算符。它没有像您提到的那样应用于指针,而是应用于值 arr[i-1]
。如果 arr[i-1] ==0
结果是 1
否则结果是 0.
~sum + 1;
~
是 位非运算符 它将反转 sum
的所有二进制位。有时也称为 ones complement
~sum +1
的结果与取sum
的补码相同,等于sum的负数。如果总和是 5
它将 return -5
逻辑运算符的更多解释
当逻辑运算符(逻辑与、或、非)应用于变量时,它只检查变量的逻辑状态。即这是 0
还是 non 0
非零可以取任何值,例如5, 10, -5
等
因此,如果您应用 !0
,您将获得值 1。对于任何其他值,例如!5
答案是0。
来自 C99 6.5.3.5
The result of the logical negation operator ! is 0 if the value of its operand compares unequal to 0, 1 if the value of its operand compares equal to 0. The result has type int. The expression !E is equivalent to (0==E)