2011-12-18 74 views
2

我有下面的代码片段大运行:这些代码片段有什么区别?

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

我改变了while循环简化和新的代码是

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

我认为上述2个的代码段的工作相同。但是第二个呢!在GDB中我看到,对于一个有32个字符的字符串,指针尾部比头部大33,应该是31.

我真的很困惑。

+2

尽管表达式的**值**('* tail'和'* tail ++')是相同的,它们的**副作用**是不同的。 – pmg 2011-12-18 22:18:19

回答

6

对于第二段代码,后增加是否发生* tail是否计算为零。

+0

谢谢。我一直在编程C多年,但偶尔会遇到这样的问题。 – 2011-12-18 23:42:08

0

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

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

所以基本上不同的是第一个将离开tail指向一个0,而第二个将在0后离开tail指向特性。

2

为什么会感到困惑?

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

第二种形式可能不太有用(因为您必须递减以回到终止符),但应该可以,因为您可以计算(但不是取消引用)地址在分配结束之后。

0

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

也许会在最后做一个呢?