【问题标题】:What is the use of operator !! in C? [duplicate]运算符有什么用!!在 C? [复制]
【发布时间】:2014-01-15 20:06:55
【问题描述】:

大家好,我将我的代码发送给您。 我认为要回答我的问题,这段代码就足够了,所以我没有发送所有代码。 在开关情况下,我可以看到 T1,T2 使用 double !这是什么意思?

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;
    }

【问题讨论】:

  • 给你的问题一个更好的标题?

标签: c pointers operators


【解决方案1】:

! 表示逻辑NOT!! 表示NOT NOT

如果操作数为零,逻辑NOT 为 1,否则为 0。 如果操作数非零,!! 为 1,如果操作数为零,则为 0。

这是一种将操作数映射为二进制 (0, 1) 刻度的便捷方式。

您可以将!!p 重写为(p ? 1 : 0)

在您的情况下,如果 p 为 NULL,!!p 为零,如果 p 为非 NULL,1 为零。

【讨论】:

    【解决方案2】:

    !是逻辑非。如果x 为0,!x 为1,如果x 不为0,则为0。

    如果!x 为0,则!!x 为1,如果!x 不为0,则为0。

    所以如果x 为0,则!!x 为0,如果x 不为0,则为1。

    短版:它将所有非零值转换为 1。

    【讨论】:

      【解决方案3】:

      !!表示非(非(整数))。一种将整数转换为布尔值(真/假)的方法。

      例子:

      int a = 5;
      int b = !!a; // b = 1
      

      【讨论】:

      • 这是 C,不是 C++,所以它只将整数转换为 0 或 1
      【解决方案4】:

      ! 是“逻辑非”的一元运算符,如果值为 0,则返回 1(真),否则返回 0(假)。

      使用比较 (a == 0) 或三元运算符 (a ? 0 : 1) 可以创建相同的效果。

      通过执行两次操作,您将得到一个否定,因此!!a 的最终结果将是(a == 0) == 0 或更短:a != 0 (a ? 1 : 0)。

      生成的代码应该(取决于您的编译器)始终相同,但 !a!!a 更短且更易于阅读,尤其是在较长的表达式中。

      与指针一起使用,这实质上创建了一个简单的检查“不是空指针”。对于一个简单的if(),这是不需要的(由于隐式转换为布尔值),但如果您想将值/结果放入位字段(如本例中),则需要它。


      我们看一下switch语句:

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

      这里发生的事情本质上是一个位域的创建。加法/乘法用于移位并合并结果。

      从右到左的位:

      • !!T1:如果T1 不为0(即不是NULL),则设置第一位。
      • 2 * !!T2:如果T2 不为0,则设置第二位。
      • 4 * !!Carry:如果Carry 不为0,则设置第三位。

      switch() 的实际案例仅代表这些位字段,并用于比较以确定不同案例的正确代码。

      【讨论】:

        猜你喜欢
        • 2021-03-28
        • 2011-10-04
        • 2011-04-18
        • 2020-07-21
        • 2017-10-26
        • 2012-10-03
        • 2011-08-19
        • 2015-01-07
        • 1970-01-01
        相关资源
        最近更新 更多