我写了这个简单的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,则第二个操作数未计算操作数。