关于语句while (*s++ != '\0')的疑问

char strcat(char *s, char *t)
{
    while (*s != '\0')
        s++;
    while ((*s++ = *t++) != '\0')
        ;
}

实现了将字符数组t拷贝在字符数组s的后面,这个方法是可以正确运行的。
可是将其改成以下代码却不能正确运行,请问是什么原因呢?

char strcat(char *s, char *t)
{
    while (*s++ != '\0')
        ;
    while ((*s++ = *t++) != '\0')
        ;
}
阅读 4.9k
4 个回答
while (*s++ != '\0')
    ;
    
等价于

char c;
do {
    c = *s;
    s++;
} while (c != '\0');

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

等价于

char c = *s;
while (c != '\0') {
    c = *s;
    s++;    
}
新手上路,请多包涵
 while (*s != '\0')
        s++;

最终s指向\0位置。

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

最终s指向\0后一位的位置。

你的前一份代码相当于

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

我的理解是当 while (*s++ != '\0') 执行最后一次时,也就是当*s等于'\0'时,这时还会执行一次s++这就导致了将t的值复制到了s\0的后面

不同意楼上的见解。++的优先级比*高这个没问题,但是楼主有没有注意到这个是后++,后++有一个特征是返回自增之前的地址,所以,错误的方法会指向/0的下一位!所以其实字符串还是被拼接起来了,只不过中间有一个/0,所以截断显示了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进