strcpy自实现中的问题

1.最近看了很多自实现的strcpy代码,基本上是下面的形式:
char * my_strcpy(char * dest, const char * src)
{
char *ch = dest;
assert(dest != NULL);

assert(src != NULL);
while ((*dest++ = *src++) != '\0'); //while最简

return dest;                            

}
甚至有的版本说while循环写成 while (*dest++ = *src++); 这种形式是
不正确的。

想了半天没搞明白为什么不正确。这两个有区别吗?
while ((*dest++ = *src++) != '\0'); 只是你显示判断表达式的值;
while (*dest++ = *src++); 是由while循环判断了表达式的值。

好像这个两种写法在自实现strcpy 中没啥区别吧?应该都可以。有人知道这两个写法在自实现strcpy上有什么区别吗?会造成什么不同的现象出现吗?

因为你没有考虑重叠

比如说有如下代码
char ch[100] = "hhello";
strcpy(ch, ch + 1);
你的代码无法正常工作,但是你试试看系统库,是可以得到hello的
不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^