while(*s++=*t++);是什么意思
这期的《程序员》里有这么一句话:“如果你不能解释为什么‘while(*s++=*t++);’的意思是进行字符串拷贝,那么你就是在对编程一窍不通的状态下编程”。看完以后把小弟吓了一跳,我真的是很不明白,这句话跟字符串拷贝有什么关系?为什么在判断条件里面用赋值呢?循环体怎么是空的?哪位高手帮忙指点指点。小弟先谢过了。 问题点数:10、回复次数:15Top
1 楼yegaofei(踏雪而歌)回复于 2005-05-12 20:56:51 得分 2
跟字符串拷贝有什么关系? 如果s和t是字符指针的就会有关系了
为什么在判断条件里面用赋值呢? C语言的特色呀,紧凑
循环体怎么是空的?字符串拷贝呀,目的已经达到了,所以是空的
Top
2 楼jiangbo1125(江小鱼)回复于 2005-05-12 21:03:14 得分 0
你是不是看错了呀。不要断章取意。这怎么可能实现呢?Top
3 楼boxban(冻酸梨)回复于 2005-05-12 22:06:55 得分 2
yegaofei(踏雪而歌) 解释的不错!
while(*s++=*t++); 在语义上等同于(注意条件部分是一个=,不是2个):
while((*t) != 0){
*s = *t;
s++;
t++;
}
显然前者更紧凑,效率(可能)更高。
Top
4 楼zhousqy(标准C匪徒)(甩拉,甩拉)回复于 2005-05-12 23:03:32 得分 2
这种代码在C里很常见的。while(*s++=*t++);先赋值,再把s和t都++Top
5 楼arrowcy(长弓手)回复于 2005-05-12 23:58:41 得分 2
这种代码在C里很常见的。while(*s++=*t++);先赋值,再把s和t都++
++之前,赋值之后还要计算整个表达式的值,也就是是否遇到了'\0'Top
6 楼xjp6688(大平/要做必须最好)回复于 2005-05-13 07:12:48 得分 0
大家都说了Top
7 楼qfeng_zhao(鱼儿鱼儿满天飞)回复于 2005-05-13 08:50:47 得分 0
up,都说了Top
8 楼djfu(飞龙在天)回复于 2005-05-13 08:59:22 得分 0
高效、简洁的字符串拷贝。Top
9 楼lucymary1982()回复于 2005-05-13 09:02:17 得分 0
很经典的写法,高手都懂得,中等程度的也该懂哈Top
10 楼lidelu(animator)回复于 2005-05-13 09:04:52 得分 2
arrowcy(长弓手)把流程解释得很清楚了
我帮你再通俗说一遍:
while(*s++=*t++); 这个在程序员杂志中,可能先声明了s和t都是字符串指针吧
在执行的时候,实现了好几个逻辑,步骤如下:
⑴ *t 的赋值给 *s
⑵判断 *s 是否为真。如果为假,则跳出循环;否则继续执行第⑶步。因为字符串是以\0结尾的,遇到\0的时候,也就是*s为假,就跳出了字符串拷贝。
⑶ s 和 t 加 1,指向下一个地址,准备拷贝下一个字符。Top
11 楼bzCpp(csdn总技术值班室之饼子堂)回复于 2005-05-13 09:18:27 得分 0
回复人: boxban(冻酸梨) ( ) 信誉:100 2005-05-12 22:06:00 得分: 0
yegaofei(踏雪而歌) 解释的不错!
while(*s++=*t++); 在语义上等同于(注意条件部分是一个=,不是2个):
while((*t) != 0){
*s = *t;
s++;
t++;
}
显然前者更紧凑,效率(可能)更高。
--------------------------------------------------------------------
不对哦,这样没有拷贝 \0.
Top
12 楼xnlcx(J2EE.Net)回复于 2005-05-13 09:29:07 得分 0
在老潭的那本C程序设计里
关于字符串复制
就有这个while (*s++ = *t++);
紧凑简洁Top
13 楼hanzikey(紫奇)回复于 2005-05-13 09:45:57 得分 0
楼主要是不提问,我还真是没有怎么注意过这个问题!
谢谢了 :)Top
14 楼liangrh7()回复于 2005-05-13 09:55:06 得分 0
其实这样写并不好,让人难理解。
换这样写就会更清晰了:
while( (*s++ = *t++) != ‘\0’ )
NULL ;Top
15 楼zhmh326(川添拓海)回复于 2005-05-15 18:26:04 得分 0
谢谢高手们的指点。Top





