[英]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
或-Wall
与gcc
会产生警告 ,例如
警告:建议在赋值周围使用括号作为真值
#-> UNPACK_WAIT_FOR_<n.th>_NIBBLE
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.