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
或 -Wall
与 gcc
produces a warning,例如
warning: suggest parentheses around assignment used as truth value
# -> UNPACK_WAIT_FOR_<n.th>_NIBBLE
我一直在努力处理 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
或 -Wall
与 gcc
produces a warning,例如
warning: suggest parentheses around assignment used as truth value
# -> UNPACK_WAIT_FOR_<n.th>_NIBBLE