评估 p && *p++

Evaluating p && *p++

我正在阅读这可以推断为

的缩写形式
if (p) { 
 *p++;
}

但不太了解其背后的逻辑。

我的理解是,如果 p 为假,则运算符无论如何都会返回 0,但如果 p 是任何其他值,则可以计算 *p++,第二部分是否取消引用指向 p 的地址中的值并递增该值1?

编辑:进一步注意,据说这是为了防止空指针访问,其中空指针 = 0x00000000。

关闭。如果 p != 0(因此假定为有效),则该块为 运行。在该块中,指针 p 被取消引用(从内存中获取一个值),该值被丢弃,并且 p 增加声明指向的任何 p 的大小。

(*p)++ 会增加 p 指向的内容。

记住,运算符 && 是惰性的:一旦它发现一个参数为假,它就不会评估另一个参数。因此,行

p && *p++

首先检查 p 是否为非 NULL。如果是,则计算下一个操作数:*p++,并检查它是否不等于零。但事情是这样的:如果 p 为真,那么根据定义,*p++ 将被执行。

添加 != NULL!= 0 部分可能会有所帮助

p != NULL && *p++ != 0

但是,不推荐使用这种代码。很难读。

I was reading this can be inferred as short form of
if (p) {
  *p++;
}

它更像是

的缩写形式
if ( !p )            // if p is NULL, *p++ is not evaluated at all,
{                    // p && *p++ evaluates to 0
  return 0;
}
else                 // if p is not NULL, *p++ is evaluated
{                    // p && *p++ evaluates to 1 if *p is not 0
  int x = 0;         // p is advanced regardless of value of *p
  if ( *p )          
    x = 1;           
  p++;
  return x;
}