c - 对c中的指针进行两次逻辑否定有什么意义?

标签 c pointers data-structures

我看的书上的二项式队列的Merge函数如下图所示:

/*Merge two binomial queues*/
/*H1 contain the result*/
BinQueue Merge(BinQueue H1, BinQueue H2){
    BinTree T1, T2, Carry = NULL;
    int i, j;
    if (H1->CurrentSize + H2->CurrentSize > Capacity)
        Error("Merge would exceed capacity");
    H1->CurrentSize += H2->CurrentSize;
    for (i = 0, j = 1; j <= H1->CurrentSize; i++, j *= 2)
    {
        T1 = H1->TheTrees[i];
        T2 = H2->TheTrees[i];
        switch (!!T1 + 2 * !!T2 + 4 * !!Carry)
        {
        case 0:
        case 1:break;
        case 2:H1->TheTrees[i] = T2;
            H2->TheTrees[i] = NULL;
            break;
        case 4:H1->TheTree[i] = Carry;
            Carry = NULL;
            break;
        case 3:Carry = CombineTrees(T1, T2);
            H1->TheTrees[i] = H2->TheTrees[i] = NULL; break;
        case 5:Carry = CombineTrees(T1, Carry);
            H1->TheTrees[i] = NULL; break;
        case 6:Carry = CombineTrees(T2, Carry);
            H1->TheTrees[i] = NULL; break;
        case 7:
            H1->TheTree[i] = Carry;
            Carry = CombineTrees(T1, T2);
            H2->TheTrees[i] = NULL; break;
        }
    }
    return H1;
}

为什么作者要对指针做两次逻辑非?

switch(!!T1+2*!!T2+4*!!Carry)

与对指针什么都不做有什么不同?

最佳答案

这是一种将非 bool 值转化为 bool 值的方法。请记住,在 C 中,零为假,而非零为真。这意味着要从其他任何东西中生成真正的 bool 值 1 或 0,您首先使用逻辑非运算符来创建一个零或一个,但这现在与我们想要的相反,所以我们再次使用逻辑非运算符来获得实际 bool 值。

例子:假设我们有

int x = -56;

现在这是非零的,因此在更广泛的意义上是“真实的”。为了使“正确的” bool 值零或一,我们首先使用逻辑非运算符

!x

它给你一个 0 (false),但这个值实际上是 true 所以我们再次应用运算符

!!x

获取值1

关于c - 对c中的指针进行两次逻辑否定有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32669058/

相关文章:

将文件中的数字字符串转换为 C 中的 int 数组

混淆 i++ 和 i=i+1

c - 如何在 C 中将 const char* 转换为 char*?

c - 释放使用双指针分配的结构数组

java - 返回可以用输入字符的子集组成的单词列表中的所有单词的集合

java - 关于快速排序

C 格式 '%d' 需要类型为 'int *' 的参数,但参数 2 的类型为 'unsigned int' [-Wformat=]

c++ - 将函数的返回值存储到指向 char 变量的指针中是正确的做法吗?

c++ - 如何在单次迭代中使用 C++ Pgm 中的指针查找字符串段落中单词的出现次数?

algorithm - 查找队列中的最小值,并将其从队列中删除