大家好,我发给你的是我的一段代码。 我想回答我的问题,这段代码已经足够,所以我没有发送所有代码。 在开关的情况下,我可以看到T1,T2使用双!这是什么意思?
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 )//what does mean??
{
case 0: /* No trees */
case 1: /* Only H1 */
break;
case 2: /* Only H2 */
H1->TheTrees[ i ] = T2;
H2->TheTrees[ i ] = NULL;
break;
case 4: /* Only Carry */
H1->TheTrees[ i ] = Carry;
Carry = NULL;
break;
case 3: /* H1 and H2 */
Carry = CombineTrees( T1, T2 );
H1->TheTrees[ i ] = H2->TheTrees[ i ] = NULL;
break;
case 5: /* H1 and Carry */
Carry = CombineTrees( T1, Carry );
H1->TheTrees[ i ] = NULL;
break;
case 6: /* H2 and Carry */
Carry = CombineTrees( T2, Carry );
H2->TheTrees[ i ] = NULL;
break;
case 7: /* All three */
H1->TheTrees[ i ] = Carry;
Carry = CombineTrees( T1, T2 );
H2->TheTrees[ i ] = NULL;
break;
}
}
return H1;
}
答案 0 :(得分:5)
!
表示逻辑NOT
。 !!
表示NOT NOT
。
如果操作数为零,则逻辑NOT
为1,否则为0。
如果操作数非零,则!!
为1,如果操作数为零,则{0}。
这是将操作数映射为二进制(0,1)比例的便捷方式。
您可以将!!p
重写为(p ? 1 : 0)
。
在您的情况下,如果!!p
为NULL,则p
为零,如果1
为非NULL,则p
。
答案 1 :(得分:3)
!逻辑上没有。如果!x
为0,则x
为1;如果x
不为0,则{0}。
!!x
为0,则 !x
为1;如果!x
不为0,则为{0>。
如果!!x
为0,则x
为0;如果x
不为0,则{1}。
简短版本:它将所有非零值转换为1.
答案 2 :(得分:2)
!!意思不是(不是(整数))。一种将整数转换为布尔值(true / false)的方法。
示例:
int a = 5;
int b = !!a; // b = 1
答案 3 :(得分:1)
!
是“逻辑非”的一元运算符,如果值为0则返回1(true),否则返回0(false)。
使用比较(a == 0
)或三元运算符(a ? 0 : 1
)可以创建相同的效果。
通过执行两次操作,您将再获得一次否定,因此!!a
的最终结果为(a == 0) == 0
或更短:a != 0
(a ? 1 : 0
)。
生成的代码应该(取决于你的编译器)总是相同,但!a
或!!a
只是更短更容易阅读,尤其是在较长的表达式中。
与指针一起使用时,这实际上创建了一个简单的检查“不是NULL指针”。对于一个简单的if()
,这不需要(由于隐式转换为布尔值),但如果您想将值/结果放入位字段(如本例中),则需要它
让我们看一下switch语句:
switch( !!T1 + 2 * !!T2 + 4 * !!Carry )
这里发生的事情主要是创建一个位域。加法/乘法用于移位位并合并结果。
从右到左的位:
!!T1
:如果T1
不为0(即不是NULL
),则设置第一位。2 * !!T2
:如果T2
不为0,则设置第二位。4 * !!Carry
:如果Carry
不为0,则设置第三位。 switch()
的实际情况只表示这些位字段,用于比较以确定不同情况的正确代码。