C指针:while(*s ++){;}和while(*s){s ++;}之间的区别

Gra*_*eme 4 c pointers

我正在经历K&R,并且在增加指针方面遇到了困难.练习5.3(p.107)要求你使用指针编写一个strcat函数.

在伪代码中,该函数执行以下操作:

  1. 取2个字符串作为输入.
  2. 找到第一个字符串的结尾.
  3. 将字符串2复制到字符串1的末尾.

我得到了一个有效的答案:

void strcats(char *s, char *t)
{
    while (*s)            /* finds end of s*/
        s++;
    while ((*s++ = *t++)) /* copies t to end of s*/
        ;
}
Run Code Online (Sandbox Code Playgroud)

但我不明白为什么这段代码也不起作用:

void strcats(char *s, char *t)
{
    while (*s++)
        ;
    while ((*s++ = *t++))
        ;
}
Run Code Online (Sandbox Code Playgroud)

显然,我错过了关于指针递增如何工作的一些信息.我认为增量的两种形式是等价的.但第二个代码只打印出字符串s.

我尝试了一个虚拟变量i来检查函数是否经历了两个循环.它做了.我阅读了K&R的第5.4和5.5节,但我找不到任何可以解释这一点的内容.

任何人都可以帮我弄清楚为什么我的功能的第二个版本没有做我想要的东西?谢谢!

编辑:谢谢大家.令人难以置信的是,在没有注意到的情况下,您可以在多长时间内盯着相对简单的错误.有时没有比让别人看一眼更好的补救措施了.

Mar*_*nen 8

这个:

while(*s++)
    ;
Run Code Online (Sandbox Code Playgroud)

由于后递增,将nul字节定位在字符串的末尾,然后在退出循环之前再次递增它. t在那之后复制nul:

scontents?tcontents?
Run Code Online (Sandbox Code Playgroud)

打印s将在第一个时间停止.

这个:

while(*s)
    s++;
Run Code Online (Sandbox Code Playgroud)

找到0时从循环中断,所以你指向nul字节. t被复制到nul:

scontentstcontents?
Run Code Online (Sandbox Code Playgroud)