我写过这个简单的C代码,
int main()
{
int *p = NULL;
if (p && *p);
//if (*p && p);
return 0;
}
当我运行此代码时,意外地我没有任何seg错误。但是,如果我在p
中更改*p
和if ()
的顺序(就像在评论中一样),我会遇到段错误。
有人可以解释原因吗?
答案 0 :(得分:4)
&&操作员有短路评估。如果只通过查看左操作数的值来确定结果,则不评估右操作数。对于&&运算符,这意味着如果左侧的计算结果为false,则它不会评估右侧,结果为false。换句话说,
if (p && *p) ...
相当于
if (p) if (*p) ...
根据C11标准,第6.5.13 / 4节:
与按位二进制&操作员,&&运营商保证从左到右的评估; 如果计算第二个操作数,则在评估之间存在一个序列点 第一和第二个操作数。如果第一个操作数比较等于0,则第二个操作数 操作数未被评估。