strcpy函数中出现的方式
一、 while(*s++=*t++); 二、 while((*t) != '\0';){ *s = *t; s++; t++; }
两者不完全等价!
while(*s++=*t++); 是先赋值*t-->*s,然后s++,t++,最后将*s的值作为判断条件。 while((*t) != '\0'){ 先拿*t的值作为判断条件 *s = *t; //再赋值 s++; //最后 自增 t++; }
想想执行完的结果: 假如是字符串的拷贝,那么
(1)前者肯定将'\0'赋给*s了,而后者没有;
(2)退出循环时,前者的s和t都指向
'\0'
的后一个位置;而后者的t指向‘ ’,s与t同步,但没有获得‘ ’
(3)若在其后加上一句prinf("%sn",s); 前者输出没有问题,后者输出可能出现问题(除非之前对s的每个位置都置0)
*s = '\0';
while(*s++=*t++)
这里实现了四个操作。
1 *s = *t, 即将s指向内存赋值为t指向内存的值;
2 执行s的自加操作;
3 执行t的自加操作;
4 判断执行自加前的*s值,如果*s为0,那么退出循环。
可以写成等价的
for循环。
for(; *s; s++, t++)
*s = *t;
=============================================
C语言中(*s++)、s++、*s++、(*s)++之间有什么区别
(*s++) 得到s指向位置的值,将该值作为表达式的结果,然后s指针往后偏移
s++ s指针往后偏移
*s++ 得到s指向位置的值,将该值作为表达式的结果,然后s指针往后偏移。和第一个一样。
(*s)++ 得到s指向位置的值,然后将该值做自加,新值作为表达式的结果值
前面3处的++都是作用在指针上,也就是
地址上
最后1个++是作用在指针指向地址上的
数值上