评估 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;
}
我正在阅读这可以推断为
的缩写形式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 ofif (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;
}