【问题标题】:question about C pointer on boolean value,关于布尔值上的 C 指针的问题,
【发布时间】:2020-01-20 01:37:01
【问题描述】:
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之前的~是什么效果?

【问题讨论】:

    标签: c boolean unary-function


    【解决方案1】:
    sum += !arr[i - 1];
    

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

    ~sum + 1;
    

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

    ~sum +1 的结果与取sum 的补码相同,等于 sum 的负数。如果 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)

    【讨论】:

    • 在这一行!arr[i - 1],所以!如果 arr[i-1] ==0? 运算符会将结果变为 1?你能详细说明一下吗?
    猜你喜欢
    • 2022-01-05
    • 2014-05-13
    • 2013-09-04
    • 2023-01-08
    • 1970-01-01
    • 2011-02-01
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多