だからね、俺も(バグってるかどうか知らん)
char *strcpy(char *dst, const char *src) {
 char *top;
 while (*dst++ = *src++);
 return top;
}
なんてのが「普通」「読みやすい」なんて全然思わない。けど、
char *strcpy(char *dst, const char *src) {
 char *top = dst;
 while (*src) {
  *dst = *src;
  ++src, ++dst;
 }
 *dst = '\0';
 return top;
}
のような使い方のほうが
char *strcpy(char *dst, const char *src) {
 int i;
 for (i = 0; src[i]; ++i) {
  dst[i] = src[i];
 }
 dst[i] = '\0';
 return dst;
}
よりも「普通」だと言いたいわけよ。
もちろん、この場合に速くなるなんて思わないけど(レジスタ変数が2つまででなければ)。