为什么没有空指针解除引用的段错误?

时间:2016-08-07 12:54:22

标签: c

我写过这个简单的C代码,

int main()
{
        int *p = NULL;
        if (p && *p);
        //if (*p && p);
        return 0;
}

当我运行此代码时,意外地我没有任何seg错误。但是,如果我在p中更改*pif ()的顺序(就像在评论中一样),我会遇到段错误。

有人可以解释原因吗?

1 个答案:

答案 0 :(得分:4)

&&操作员有短路评估。如果只通过查看左操作数的值来确定结果,则不评估右操作数。对于&&运算符,这意味着如果左侧的计算结果为false,则它不会评估右侧,结果为false。换句话说,

if (p && *p) ...

相当于

if (p) if (*p) ...

根据C11标准,第6.5.13 / 4节:

  

与按位二进制&操作员,&&运营商保证从左到右的评估;   如果计算第二个操作数,则在评估之间存在一个序列点   第一和第二个操作数。如果第一个操作数比较等于0,则第二个操作数   操作数未被评估。