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.可能不是这样的,谢谢你的答案,我认为这是作者试图得到的,因为它还声明了逻辑是为了防止空指针访问(抱歉,我刚把它放在我的编辑上面的帖子中)。谢谢你的答案,我想这就是作者试图达到的目的,因为它也说明了逻辑是为了防止空指针访问(很抱歉,我刚刚在我的文章上面的编辑中包含了这一点)。