为什么程序会错过"if"运算符?

Why does program miss 'if' operator?

本文关键字:if 运算符 错过 程序 为什么      更新时间:2023-10-16

问题是程序执行错误,因为它显然错过了某些函数中的条件语句。

下面是一些示例:

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 的语句的原因,但它们不能执行。

编辑:诅咒我,因为我没有注意到有|而不是&因为它确实&,直到我不专心地在某个时候更改了代码。

0x40

将被计算为 true,任何不为零的整数也是如此。由于0x40 | x对于任何x始终将至少一个位设置为 1,因此它永远不会变为 0,因此此表达式将始终计算为true0x1也是如此。

您可能想使用&来检查标志是否包含特定值:

if (SOME_VAL_1 & eventsFlags) {...}
if (SOME_VAL_2 & eventsFlags) {...}

您正在检查的条件始终为真。eventsFlags没有值使其为 false,因为SOME_VAL_1始终不为零。

如果ab是整数,则仅当ab均为零时,(a | b)才为假。