繁体   English   中英

开关和if else语句之间的区别

[英]difference beetween switch and if else statement

我在if else语句中苦苦挣扎,并决定尝试使用switch语句,并且由于某种原因它碰巧可以正常工作,现在我的程序可以正常工作了。但是这让我想知道这两个代码之间有什么不同。他们俩都应该工作,但由于某种原因不能。

如果:

   if (nibbleState = UNPACK_WAIT_FOR_1ST_NIBBLE)
    {
        if ((code = isUnPackedItem(nb)) == UNPACKED_ITEM)
        {
            nibbleState = UNPACK_WAIT_FOR_2ND_NIBBLE;
        }
        else
        {
            putc(code, fpOut);
            ++byteOutCnt;
        }
    }
    else if (nibbleState = UNPACK_WAIT_FOR_2ND_NIBBLE)
    {
        nibbleState = nb;
        nibbleState = UNPACK_WAIT_FOR_3RD_NIBBLE;
    }
    else if (nibbleState = UNPACK_WAIT_FOR_3RD_NIBBLE)
    {
        nibbleLow = nb;
        putc((nibbleMid << 4 | nibbleLow, fpOut);
        nibbleState = UNPACK_WAIT_FOR_1ST_NIBBLE;
        ++byteOutCnt;
    }

开关:

switch (nibbleState)
    {
    case UNPACK_WAIT_FOR_1ST_NIBBLE:
        if ((code = isUnPackedItem(nb)) == UNPACKED_ITEM)
        {

            nibbleState = UNPACK_WAIT_FOR_2ND_NIBBLE;
        }
        else
        {
            putc(code, fpOut);
            ++byteOutCnt;
        }
        break;
    case UNPACK_WAIT_FOR_2ND_NIBBLE:
        nibbleMid = nb;
        nibbleState = UNPACK_WAIT_FOR_3RD_NIBBLE;
        break;
    case UNPACK_WAIT_FOR_3RD_NIBBLE:
        nibbleLow = nb;
        putc((nibbleMid << 4) | nibbleLow, fpOut);
        nibbleState = UNPACK_WAIT_FOR_1ST_NIBBLE;
        ++byteOutCnt;
        break;
    }

在if语句中检查条件时,我们必须使用==运算符检查条件是否相等。 但是,您正在将UNPACK_WAIT_FOR_1ST_NIBBLE的值分配给nibbleState 这不是条件。 您必须检查条件为

         if (nibbleState == UNPACK_WAIT_FOR_1ST_NIBBLE) //condition to check whether both are equal.
 if (nibbleState = UNPACK_WAIT_FOR_1ST_NIBBLE)

应该

 if (nibbleState == UNPACK_WAIT_FOR_1ST_NIBBLE)

其余检查也是如此。 打开警告,编译器应该就这段代码向您发出警告。

您正在将值分配给该变量,当该值不为零时,它将始终为true。 将条件变成这样

if (nibbleState == UNPACK_WAIT_FOR_1ST_NIBBLE)

虽然做了分配,你正在做这样的, nibbleState=UNPACK_WAIT_FOR_1ST_NIBBLE所以价值UNPACK_WAIT_FOR_1ST_NIBBLE将分配给该变量。 如果此变量UNPACK_WAIT_FOR_1ST_NIBBLE值不为零,则该第一个条件将始终为true。 因此它不会检查其他内容。

开关具有直接的存储器跳转,而其他情况则具有字节代码中的链接跳转。

如果比切换情况更慢

供您参考。

如上所述,当您应检查条件(==)时,您正在为nibbleState(=)分配一个值。

此外,我注意到在第二次条件检查中,您正在将一个值双重分配给同一变量(覆盖第一次分配)。

else if (nibbleState = UNPACK_WAIT_FOR_2ND_NIBBLE)
{
    nibbleState = nb; // <<  This value gets overwritten by the next line
    nibbleState = UNPACK_WAIT_FOR_3RD_NIBBLE;
}

在使用if..else条件的情况下的问题是,不是使用==运算符检查是否相等,而是使用了赋值运算符=

预期行为

根据定义的值检查nibbleState的值。 if条件相等, if条件产生TRUE

实际行为

定义的值分配nibbleState 如果定义的值非零if条件产生TRUE

建议:启用辅助标记,以警告您潜在的陷阱,如下所示。 在上述情况下,将-Wparentheses-Wallgcc 会产生警告 ,例如

警告:建议在赋值周围使用括号作为真值


#-> UNPACK_WAIT_FOR_<n.th>_NIBBLE

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM