我正在阅读此内容,可以推断为
的简短形式if (p) {
*p++;
}
,但不太了解其背后的逻辑。
我的理解是如果p是错误的,那么运算符在0中导致0,但是如果p是其他值,则可以评估 *p ,是第二部分,在指向p的地址中取消了该值,并将其递增为1?
编辑:进一步注意,据说可以防止null指针访问null指针= 0x00000000。
我正在阅读此内容,可以推断为简短的形式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++
首先检查p
是否为非NULL。如果是这样,它将评估下一个操作数:*p++
,并检查它是否不等于零。但这是事实:如果p
为TRUE,则根据定义,*p++
将被执行。
它可能有助于添加这些!= NULL
和!= 0
Parts
p != NULL && *p++ != 0
但是,不建议使用这种代码。很难阅读。
关闭。如果p!= 0(因此被认为是有效的(,则该块是运行的。在块中,指针p被删除(从内存中获取值(,该值被扔掉,P会被宣布指向的任何P的大小增加。
(*p( 会增加p指向。