关于布尔值上的C指针的问题,
我遇到过这段代码,但不太懂关于布尔值上的C指针的问题,,c,boolean,unary-function,C,Boolean,Unary Function,我遇到过这段代码,但不太懂sum+=!arr[i-1]:它的效果是什么!(未)应用于数组的指针?另外,~beforesum的效果如何 int bar(int *arr, size_t n) { int sum = 0, i; for (i = n; i > 0; i--) { sum += !arr[i - 1]; } return ~sum + 1; } 是逻辑求反运算符。它不适用于您提到的指针,而是应用于值arr[i-1]。如果
sum+=!arr[i-1]代码>:它的效果是什么!(未)应用于数组的指针?另外,~beforesum
的效果如何
int bar(int *arr, size_t n)
{
int sum = 0, i;
for (i = n; i > 0; i--)
{
sum += !arr[i - 1];
}
return ~sum + 1;
}
是逻辑求反运算符。它不适用于您提到的指针,而是应用于值arr[i-1]
。如果arr[i-1]==0
则结果为1
,否则结果为0
sum += !arr[i - 1];
~
是按位NOT运算符它将反转和的所有二进制位
。有时也被称为补语
~sum+1
的结果与取sum
的二者的补数相同,等于sum的负数。如果总和是5
,它将返回-5
关于逻辑运算符的更多解释
当逻辑运算符(逻辑AND、OR、NOT)应用于变量时,它只检查变量的逻辑状态。i、 e.这是无论是0
还是非0
非零都可以取任何值,例如5、10、-5
等
因此,如果您应用!0
您得到的值为1。对于任何其他值,例如!5
答案是0
从C99 6.5.3.5
逻辑求反运算符的结果!如果其操作数的值比较不等于0,则为0;如果其操作数的值比较等于0,则为1。结果的类型为int。表达式为!E等于(0==E)
在这条线上!arr[i-1],所以!如果arr[i-1]==0,操作员将结果变为1?你能再详细一点吗?
~sum + 1;