为什么while (*s++ = *t++);这句代码的作用是复制字符串?

时间:2022-12-13 14:55:30

1、为什么while (*s++ = *t++);这句代码的作用是复制字符串?
为什么while (*s++ = *t++);这句代码的作用是复制字符串?

测试代码如上,
可以这么理解:
1)、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){}跳出循环。

2)、while(*s++=*t++)
这里实现了四个操作。
1 *s = *t, 即将s指向内存赋值为t指向内存的值;
2 执行s的自加操作;
3 执行t的自加操作;
4 判断执行自加前的*s值,如果*s为0,那么退出循环。
可以写成等价的for循环。
for(; *s; s++, t++)
*s = *t;

3)、或者可以拆分如下:
while(*s++=*t++); 在语义上等同于(注意条件部分是一个=,不是2个):

while( (*t) != 0)
{
*s = *t;
s++;
t++;
}

备注:strcat, strcpy, strcmp, strlen 这几个函数的原型一定要重点理解,关键是自己能写出实现算法。

测试代码如下:

#include<stdio.h>
int main(int argc, const char *argv[])
{
int a[6] = {1,3,5,7,9};
int b[6] = {2,4,6,8,10};//这里可以把b【j】里面的值替换成0来测试while什么时候结束循环。
int i = 0, j = 0;

while(a[i] = b[i])
{
i++;
}

printf("i = %d\n",i); //这里是调试看i是在第几次循环后跳出的。

for(j = 0;j < sizeof(a)/sizeof(a[0]);j++)
{
printf("a[%d] = %d ",j,a[j]);
}

putchar('\n');

for(j = 0;j < sizeof(b)/sizeof(b[0]);j++)
{
printf("b[%d] = %d ",j,b[j]);
}

putchar('\n');

return 0;
}