c为什么空指针取消引用没有segfault



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

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

当我运行这个代码时,出乎意料的是我没有任何seg错误。但如果我更改if ()p*p的顺序(如注释中所示(,我确实会出现seg错误。

有人能解释一下原因吗?

&操作员进行短路评估。如果只看左操作数的值就可以确定结果,那么就不会计算右操作数。对于&运算符,这意味着如果左侧的计算结果为false,则不对右侧进行计算,结果为false。换句话说,

if (p && *p) ...

相当于

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

C11标准第6.5.13/4节:

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

最新更新