在下面的代码:Ç - 指针运算
int strlen(char *s){
char *p = s;
while(*p++ != '\0');
return p - s;
}
为什么上面的评价比这是不同的:
int strlen(char *s){
char *p = s;
while(*p != '\0') p++;
return p - s;
}
这是我的理解,表达将首先评估,然后递增。
在下面的代码:Ç - 指针运算
int strlen(char *s){
char *p = s;
while(*p++ != '\0');
return p - s;
}
为什么上面的评价比这是不同的:
int strlen(char *s){
char *p = s;
while(*p != '\0') p++;
return p - s;
}
这是我的理解,表达将首先评估,然后递增。
在第一个代码p
中增加,无论while()
条件是真还是假。
在第二段代码中,p
仅在while
条件为真时递增。
在第一种情况: -
while(*p++ != '\0');
则p将只是一个表达式的求值而不管是否因为++
是条件表达式的一部分的条件是真还是假后递增。
然而,在第二个: -
while(*p != '\0') p++;
首先病情会进行检查,如果这是真的那么只有普将增加。
不,我认为比较发生在**两个**案例的增量之前。在比较之前'++ p'会做增量。但在第一种情况下,即使字符串长度为零,也会执行增量。 –
@Sanjay,哦......是的,实际上增量会在检查条件之后发生。不管是真是假(First Case)。我忘记了这是一个后增量。 ;) –
如果'* p'包含'\ 0',则首先检查条件。如果是这样,则在第二个片段中增加“p ++”。然而,无论第一个片段中的真或假情况如何,“p”都会增加。 –
考虑在while循环的最后一步时,*p = '\0'
。
在1个ST代码:
while(*p++ != '\0');
p
仍然得到一个增量,指针背后'\0'
的元素。
在2 第二代码:
while(*p != '\0') p++;
*p != '\0'
是不正确的,所以当循环结束,对没有得到增量。 p
指向'\0'
。
你知道'i ++'和'++ i'有区别吗? –
两者都将变量加1,如果不在表达式中,则会得到相同的答案。我可以在实践中正确地使用这两者,但在我看来,与指针类似的使用产生了不同的结果。如:if(i ++> 5),将使用i的原始值,并在评估之后递增。 – sherrellbc
因为两者之间存在差异,但与指针无关。尝试'int i = 3,j = 3; printf(“%d,%d \ n”,++ i,j ++);'。 –