我看的书上的二项式队列的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/