这些代码片段有什么区别?

时间:2011-12-18 22:09:15

标签: c

我有以下代码片段运行良好:

char* head = str;
char* tail = head;
while ( *tail ) {
    ++tail;
}

我更改了while循环以简化,新代码是

char* head = str;
char* tail = head;
while ( *tail++ );

我相信以上2个代码段的工作方式相同。但第二个呢!在GDB中我看到,对于一个包含32个字符的字符串,指针尾部比头部大33,应该是31。

我真的很困惑。

4 个答案:

答案 0 :(得分:6)

对于第二段代码,无论* tail是否计算为零,都会发生后增量。

答案 1 :(得分:2)

为何困惑?

增量在第一种情况下是有条件的,在第二种情况下是无条件的。

第二种形式可能不太有用(因为你必须减少以返回到终结符),但是应该没问题,因为你可以在分配结束后计算(但不能解除引用)地址。

答案 2 :(得分:0)

第一个将检查*tail是否不为0,如果不为0,则递增tail。如果它为0,它将在递增tail之前停止循环。

第二个会增加tail,然后检查tail的旧值是否指向0。如果没有,它将继续。如果是这样,它将停止,但请注意它已经增加tail

所以基本上差异是第一个会让tail指向0,而第二个会让tail指向0之后的字符。< / p>

答案 3 :(得分:0)

对于第二个,你需要提供一个你希望它应用的条件,否则你会得到那些副作用。

最后可能会抛出一个做什么?