while(*s++=*t++);是什么意思

swanmy 2005-05-12 08:16:17
这期的《程序员》里有这么一句话:“如果你不能解释为什么‘while(*s++=*t++);’的意思是进行字符串拷贝,那么你就是在对编程一窍不通的状态下编程”。看完以后把小弟吓了一跳,我真的是很不明白,这句话跟字符串拷贝有什么关系?为什么在判断条件里面用赋值呢?循环体怎么是空的?哪位高手帮忙指点指点。小弟先谢过了。
...全文
1210 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
swanmy 2005-05-15
  • 打赏
  • 举报
回复
谢谢高手们的指点。
liangrh7 2005-05-13
  • 打赏
  • 举报
回复
其实这样写并不好,让人难理解。

换这样写就会更清晰了:

while( (*s++ = *t++) != ‘\0’ )
NULL ;
hanzikey 2005-05-13
  • 打赏
  • 举报
回复
楼主要是不提问,我还真是没有怎么注意过这个问题!
谢谢了 :)
xnlcx 2005-05-13
  • 打赏
  • 举报
回复
在老潭的那本C程序设计里
关于字符串复制
就有这个while (*s++ = *t++);

紧凑简洁
bzCpp 2005-05-13
  • 打赏
  • 举报
回复 1
回复人: boxban(冻酸梨) ( ) 信誉:100 2005-05-12 22:06:00 得分: 0


yegaofei(踏雪而歌) 解释的不错!

while(*s++=*t++); 在语义上等同于(注意条件部分是一个=,不是2个):

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

显然前者更紧凑,效率(可能)更高。

--------------------------------------------------------------------

不对哦,这样没有拷贝 \0.

lidelu 2005-05-13
  • 打赏
  • 举报
回复
arrowcy(长弓手)把流程解释得很清楚了
我帮你再通俗说一遍:

while(*s++=*t++); 这个在程序员杂志中,可能先声明了s和t都是字符串指针吧
在执行的时候,实现了好几个逻辑,步骤如下:
⑴ *t 的赋值给 *s
⑵判断 *s 是否为真。如果为假,则跳出循环;否则继续执行第⑶步。因为字符串是以\0结尾的,遇到\0的时候,也就是*s为假,就跳出了字符串拷贝。
⑶ s 和 t 加 1,指向下一个地址,准备拷贝下一个字符。
lucymary1982 2005-05-13
  • 打赏
  • 举报
回复
很经典的写法,高手都懂得,中等程度的也该懂哈
djfu 2005-05-13
  • 打赏
  • 举报
回复
高效、简洁的字符串拷贝。
qfeng_zhao 2005-05-13
  • 打赏
  • 举报
回复
up,都说了
xjp6688 2005-05-13
  • 打赏
  • 举报
回复
大家都说了
arrowcy 2005-05-12
  • 打赏
  • 举报
回复
这种代码在C里很常见的。while(*s++=*t++);先赋值,再把s和t都++
++之前,赋值之后还要计算整个表达式的值,也就是是否遇到了'\0'
zhousqy 2005-05-12
  • 打赏
  • 举报
回复
这种代码在C里很常见的。while(*s++=*t++);先赋值,再把s和t都++
boxban 2005-05-12
  • 打赏
  • 举报
回复
yegaofei(踏雪而歌) 解释的不错!

while(*s++=*t++); 在语义上等同于(注意条件部分是一个=,不是2个):

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

显然前者更紧凑,效率(可能)更高。
jiangbo1125 2005-05-12
  • 打赏
  • 举报
回复
你是不是看错了呀。不要断章取意。这怎么可能实现呢?
yegaofei 2005-05-12
  • 打赏
  • 举报
回复
跟字符串拷贝有什么关系? 如果s和t是字符指针的就会有关系了
为什么在判断条件里面用赋值呢? C语言的特色呀,紧凑
循环体怎么是空的?字符串拷贝呀,目的已经达到了,所以是空的

15,440

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧