2013-07-14 142 views
3

在下面的代码:Ç - 指针运算

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

这是我的理解,表达将首先评估,然后递增。

+0

你知道'i ++'和'++ i'有区别吗? –

+0

两者都将变量加1,如果不在表达式中,则会得到相同的答案。我可以在实践中正确地使用这两者,但在我看来,与指针类似的使用产生了不同的结果。如:if(i ++> 5),将使用i的原始值,并在评估之后递增。 – sherrellbc

+0

因为两者之间存在差异,但与指针无关。尝试'int i = 3,j = 3; printf(“%d,%d \ n”,++ i,j ++);'。 –

回答

10

在第一个代码p中增加,无论while()条件是真还是假。

在第二段代码中,p仅在while条件为真时递增。

+0

现货答案+1 :) – 0decimal0

+0

@PHI创始人谢谢:-) –

+0

Bhai **:**第一可以纠正为'while(* p ++); “(0123); –

0

在第一种情况: -

while(*p++ != '\0'); 

则p将只是一个表达式的求值而不管是否因为++是条件表达式的一部分的条件是真还是假后递增。

然而,在第二个: -

while(*p != '\0') p++; 

首先病情会进行检查,如果这是真的那么只有普将增加。

+0

不,我认为比较发生在**两个**案例的增量之前。在比较之前'++ p'会做增量。但在第一种情况下,即使字符串长度为零,也会执行增量。 –

+0

@Sanjay,哦......是的,实际上增量会在检查条件之后发生。不管是真是假(First Case)。我忘记了这是一个后增量。 ;) –

+0

如果'* p'包含'\ 0',则首先检查条件。如果是这样,则在第二个片段中增加“p ++”。然而,无论第一个片段中的真或假情况如何,“p”都会增加。 –

2

考虑在while循环的最后一步时,*p = '\0'

在1个ST代码:

while(*p++ != '\0'); 

p仍然得到一个增量,指针背后'\0'的元素。

在2 第二代码:

while(*p != '\0') p++; 

*p != '\0'是不正确的,所以当循环结束,对没有得到增量。 p指向'\0'