C 评估p&&*p++;

C 评估p&&*p++;,c,pointers,logical-operators,C,Pointers,Logical Operators,我在读这篇文章,可以推断为 if (p) { *p++; } if (p) { *p++; } 但不太明白背后的逻辑 我的理解是,如果p为false,那么不管p是什么,运算符都会得到0,但是如果p是任何其他值,那么可以计算*p++,第二部分是否将地址中的值反引用并将其递增1 编辑:进一步注意,据说这是为了防止空指针访问空指针=0x00000000。关闭。如果p!=0(因此假定为有效),则运行该块。在该块中,指针p被取消引用(从内存中提取一个值),该值被丢弃,并且p被递增为声明指向的任何

我在读这篇文章,可以推断为

if (p) { 
 *p++;
}
if (p) {
  *p++;
}
但不太明白背后的逻辑

我的理解是,如果p为false,那么不管p是什么,运算符都会得到0,但是如果p是任何其他值,那么可以计算*p++,第二部分是否将地址中的值反引用并将其递增1

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

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

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

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


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

记住,操作符
&&
是懒惰的:只要它看到一个参数为false,它就不会计算另一个参数。因此,这条线

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

添加这些
!=空值
!=0
零件

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

但是,不建议使用这种代码。它很难阅读。

记住,操作符
&&
是懒惰的:只要它看到一个参数为false,它就不会计算另一个参数。因此,这条线

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

添加这些
!=空值
!=0
零件

p != NULL && *p++ != 0
但是,不建议使用这种代码。这很难读。

我在读这篇文章,可以推断为
if (p) {
  *p++;
}
它更像是一种简短的语言形式

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;
}
我在读这篇文章,可以推断为
if (p) {
  *p++;
}
它更像是一种简短的语言形式

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;
}

@如果(p){*p++;}没有意义,请输入此代码段。不使用取消引用的指针。@ VladfromMoscow:如果<代码> p>代码>是指向易失性的指针,它被使用了,不是吗?@ KrErkSB在哪里使用?@ VladfromMoscow:HM,也许我把它与C++混淆了。在C++中,这将需要一个LValuto RValo转换,但是如果(p){*p++;}没有意义,那么在c@ @ diANTE这个代码片段中它可能不是这样。不使用取消引用的指针。@ VladfromMoscow:如果<代码> p>代码>是指向易失性的指针,它被使用了,不是吗?@ KrErkSB在哪里使用?@ VladfromMoscow:HM,也许我把它与C++混淆了。在C++中,这将需要一个LValto RVALY转换,但在C.可能不是这样的,谢谢你的答案,我认为这是作者试图得到的,因为它还声明了逻辑是为了防止空指针访问(抱歉,我刚把它放在我的编辑上面的帖子中)。谢谢你的答案,我想这就是作者试图达到的目的,因为它也说明了逻辑是为了防止空指针访问(很抱歉,我刚刚在我的文章上面的编辑中包含了这一点)。