switch和if else语句之间的区别

时间:2015-03-24 11:39:21

标签: c if-statement switch-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;
    }

6 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

 if (nibbleState = UNPACK_WAIT_FOR_1ST_NIBBLE)

应该是

 if (nibbleState == UNPACK_WAIT_FOR_1ST_NIBBLE)

其他检查也是如此。打开警告,编译器应该警告你这段代码。

答案 2 :(得分:0)

您正在为该变量赋值,当该值不为零时,它始终为true。  将条件改为这样。

if (nibbleState == UNPACK_WAIT_FOR_1ST_NIBBLE)

在进行分配时,您正是这样做的,nibbleState=UNPACK_WAIT_FOR_1ST_NIBBLE因此UNPACK_WAIT_FOR_1ST_NIBBLE的值将分配给该变量。如果此变量UNPACK_WAIT_FOR_1ST_NIBBLE的值不为零,则第一个条件将始终为真。所以它不会检查其他东西。

答案 3 :(得分:0)

switch有直接内存跳转,而if else在你的字节码中有链接跳转。

if else比switch case慢

代表reference.

答案 4 :(得分:0)

如上所述,当您应该检查条件(==)时,您要为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;
}

答案 5 :(得分:0)

如果您使用if..else条件,则问题是,您使用了==运算符,而不是使用=运算符来检查相等性。

  

预期行为

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

  

实际行为

定义的值分配给nibbleState。如果非零中定义的值,则if条件会产生 TRUE

建议:启用compilar标志以警告您这样的潜在陷阱。在上述情况下,-Wparentheses-Wallgcc produces a warning一起使用,例如

  

警告:建议用作真值的分配括号


# - &gt; UNPACK_WAIT_FOR_<n.th>_NIBBLE

相关问题