C组合,如果评估逻辑运算优先级

时间:2013-08-28 15:23:32

标签: c

我想知道是否总是会编译以下代码,以便没有非法的NULL ptr解引用?

我担心的是编译器在第一次检查“b”是否为NULL之前可能会检查b->值。

typedef struct
{
    int value;
} mystruct;

int func(mystruct * b)
{
    if((NULL == b) || (b->value == 0))
    {
        return -1;
    }

    printf("value: %d\n", b->value);
}

3 个答案:

答案 0 :(得分:2)

如果bNULL,则(NULL != b) false ,则会检查第二方。 (参见Short-Circuit evaluation)你可能会得到NULL ptr dereferences。

||更改为&&

答案 1 :(得分:2)

是的,(NULL != b)将在(b->value == 0)之前进行测试。

您所做的是Short-Circuit Evaluation

答案 2 :(得分:0)

您不必担心,除非第一个条件尚未确定结果,否则不会执行第二个条件。