【问题标题】:C combination if evaluation of logical operations precedence [duplicate]如果评估逻辑运算优先级,则C组合[重复]
【发布时间】:2013-08-31 18:32:35
【问题描述】:

不知道下面的代码会不会一直编译,这样就不会出现非法的NULL ptr解引用?

我担心的是编译器可能会在首先检查“b”是否为 NULL 之前检查 b->value。

typedef struct
{
    int value;
} mystruct;

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

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

【问题讨论】:

标签: c


【解决方案1】:

如果bNULL 那么(NULL != b)false,那么第二面将被检查。 (请参阅Short-Circuit evaluation),您可能会得到 NULL ptr 取消引用。

|| 更改为&&

【讨论】:

    【解决方案2】:

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

    你所做的被称为Short-Circuit Evaluation

    【讨论】:

    • +1 维基百科参考
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-17
      • 1970-01-01
      • 2015-09-20
      • 2018-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多