问题在于程序执行错误,因为它显然错过了某些功能中的条件语句。
以下是一些示例:
void f(uint32_t eventsFlags) // eventFlags == 0x1
{
// statement 1
...
// statement N
if (SOME_VAL_1 | eventsFlags) // SOME_VAL_1 == 0x1 (true)
{
// statement N+1
...
// statement M
}
if (SOME_VAL_2 | eventsFlags) // SOME_VAL_2 == 0x40 (false)
{
// statement M+1
...
// statement K
}
}
当我调试它时,“语句N + 1”紧接在“语句N”之后,缺少它们之间的条件检查。 '语句M'和'语句M + 1'以及它们之间的条件检查发生了相同的事情。这就是执行从M + 1到K的语句的原因,但是它们必须不执行。
编辑:对我很感激,因为我没有注意到|
,而是&
,因为它确实是&
,直到我疏忽地更改了代码。
答案 0 :(得分:3)
0x40
和所有非零的整数都将被评估为true。由于0x40 | x
对于任何x
都将至少有一位被设置为1,因此它将永远不会变为0,因此该表达式将始终被评估为true
。 0x1
也是如此。
可能您想使用&
来检查标志是否包含特定值:
if (SOME_VAL_1 & eventsFlags) {...}
if (SOME_VAL_2 & eventsFlags) {...}
答案 1 :(得分:2)
您要检查的条件始终为真。由于eventsFlags
总是非零,因此SOME_VAL_1
的值不会为假。
如果a
和b
是整数,则(a | b)
仅在a
和b
均为零的情况下为假。