我有以下代码片段运行良好:
char* head = str;
char* tail = head;
while ( *tail ) {
++tail;
}
我更改了while循环以简化,新代码是
char* head = str;
char* tail = head;
while ( *tail++ );
我相信以上2个代码段的工作方式相同。但第二个呢!在GDB中我看到,对于一个包含32个字符的字符串,指针尾部比头部大33,应该是31。
我真的很困惑。
答案 0 :(得分:6)
对于第二段代码,无论* tail是否计算为零,都会发生后增量。
答案 1 :(得分:2)
为何困惑?
增量在第一种情况下是有条件的,在第二种情况下是无条件的。
第二种形式可能不太有用(因为你必须减少以返回到终结符),但是应该没问题,因为你可以在分配结束后计算(但不能解除引用)地址。
答案 2 :(得分:0)
第一个将检查*tail
是否不为0,如果不为0,则递增tail
。如果它为0,它将在递增tail
之前停止循环。
第二个会增加tail
,然后检查tail
的旧值是否指向0
。如果没有,它将继续。如果是这样,它将停止,但请注意它已经增加tail
。
所以基本上差异是第一个会让tail
指向0
,而第二个会让tail
指向0
之后的字符。< / p>
答案 3 :(得分:0)
对于第二个,你需要提供一个你希望它应用的条件,否则你会得到那些副作用。
最后可能会抛出一个做什么?