操作员有什么用!!在C?

时间:2013-12-28 11:39:06

标签: c pointers operators

大家好,我发给你的是我的一段代码。 我想回答我的问题,这段代码已经足够,所以我没有发送所有代码。 在开关的情况下,我可以看到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;
    }

4 个答案:

答案 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 != 0a ? 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()的实际情况只表示这些位字段,用于比较以确定不同情况的正确代码。