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

时间:2019-12-19 11:07:10

标签: c++ gcc gdb

问题在于程序执行错误,因为它显然错过了某些功能中的条件语句。

以下是一些示例:

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

编辑:对我很感激,因为我没有注意到|,而是&,因为它确实是&,直到我疏忽地更改了代码。

2 个答案:

答案 0 :(得分:3)

0x40和所有非零的整数都将被评估为true。由于0x40 | x对于任何x都将至少有一位被设置为1,因此它将永远不会变为0,因此该表达式将始终被评估为true0x1也是如此。

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

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

答案 1 :(得分:2)

您要检查的条件始终为真。由于eventsFlags总是非零,因此SOME_VAL_1的值不会为假。

如果ab是整数,则(a | b)仅在ab均为零的情况下为假。