switch 和 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 (nibbleState = UNPACK_WAIT_FOR_1ST_NIBBLE)

应该是

 if (nibbleState == UNPACK_WAIT_FOR_1ST_NIBBLE)

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

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

if (nibbleState == UNPACK_WAIT_FOR_1ST_NIBBLE)

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

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

if else 比 switch case 慢

为了你的reference.

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

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

如上所述,当您应该检查条件 (==) 时,您正在为 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 条件时的问题是,您没有使用 == 运算符检查相等性,而是使用了赋值运算符 =.

Expected behaviour

对照定义的值#检查nibbleState的值。 if 条件产生 TRUE 如果值相等

Actual Behaviour

将定义的值赋给nibbleState。如果 非零 中的定义值,if 条件产生 TRUE.

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

warning: suggest parentheses around assignment used as truth value


# -> UNPACK_WAIT_FOR_<n.th>_NIBBLE