今天在网上看到一个问题:为什么 while (*s++ = *t++); 的作用是复制字符串?因为自己 C 语言功底不好,所以也经过了一番搜索才得到答案。在这里记录一下。

a = \*t++; 表示 a = \*t; 接着 ++t;

同理,\*s++ = a; 表示 \*s = a; 之后 ++s;

所以 \*s++ = \*t++; 等价于:

a = *t;
++t;
*s = a;
++s; 

所以上面的语句每执行一次,便把当前 *t 的值赋给 *s,接着地址 t 和 s 前移一位。因此利用 while 循环即可实现字符串的复制。

关于跳出循环,while(a = b) {} 表示 a = b; while(a) { }

所以当 b 的值为 0 时跳出循环。即当 *t 为字符串末尾的结束符 \0 时,*s = \0; 因为 \0 在 ASCII 码中编码为 0,之后执行 while(0){} 跳出循环。

所以源代码可以等价为:

for ( ; *s; s++, t++) {
    *s = *t;
}