免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: M.I.X
打印 上一主题 下一主题

[函数] 曾面试时被问:strcpy函数为什么要返回指针? [复制链接]

论坛徽章:
0
21 [报告]
发表于 2007-08-05 21:00 |只看该作者
长度不是strcpy的结果. 而且长度是strcpy本身不关心和不知道的(除非你自己写一个strcpy).

还有,memcpy, strcat, strcpy, strncpy, memset, ....... 一系列都返回dest. 目的应该都是一样的.

原帖由 yg 于 2007-8-5 20:30 发表
也不见得一定要返回首指针。字符串有两个属性,首指针和长度。所以,我在写字符串处理函数时,喜欢返回长度。可以想象一下,连续strcpy和strcat,效率会差很多。

论坛徽章:
0
22 [报告]
发表于 2007-08-05 21:22 |只看该作者
原帖由 思一克 于 2007-8-5 18:30 发表
FUNCTION的设计一般都是取输入参数,计算后返回结果.
有时候,结果也在参数中(也是输入),虽然可以不返回.

然而不返回有些浪费了FUNCTION的能力,还引起使用他们的函数效率低下.
比如

char buf[128];
char ...


效率差不多吧?
不就差一条movl指令吗?

论坛徽章:
0
23 [报告]
发表于 2007-08-05 21:33 |只看该作者
TO JOHNBULL,

[没有事情,上来看看.你也没有休息?]

一共就几条指令,差一条就有不小影响. 如果strcpy是在循环中大次数调用,差别就大了.

还有,返回dest可以这样调用:

last_str = strcat(strcpy(buf, "1283983983983"), strcat(strcpy(buf1, "aasdfiiioioaoisfioasfio"), "AAAASFDKKBKBKK"));

strXXXX大都返回dest. 如果不是, 那就不好写了, 效率也会低更多.

论坛徽章:
0
24 [报告]
发表于 2007-08-05 21:36 |只看该作者
那么,strcpy 没有返回值(void strcpy)和有返回值(char *strcpy)的效率差异呢?你计算了吗?

last_str = strcat(strcpy(buf, "1283983983983"), strcat(strcpy(buf1, "aasdfiiioioaoisfioasfio"), "AAAASFDKKBKBKK"));

这种写法的可读性太差了点吧

[ 本帖最后由 antigloss 于 2007-8-5 21:37 编辑 ]

论坛徽章:
0
25 [报告]
发表于 2007-08-05 21:39 |只看该作者
如果void strcpy(),那么上面的表达方式就要分开写. 差别就更多了.

你可以自己实验,用一个整体的和分开的,看差多少语句


原帖由 antigloss 于 2007-8-5 21:36 发表
那么,strcpy 没有返回值(void strcpy)和有返回值(char *strcpy)的效率差异呢?你计算了吗?

论坛徽章:
0
26 [报告]
发表于 2007-08-05 21:41 |只看该作者
效率并不主要的原因,况且返不返回效率确实几乎没什么差别。

论坛徽章:
0
27 [报告]
发表于 2007-08-05 21:44 |只看该作者
知道你的意思了.

主要是接口要统一.又要方便调用者. FUNCTION返回结果是最正常不过的了.能返回的WHY NOT?
而且,返回又带来无数的方便(使FUNCTION成为复杂表达式的一部分). 如果没有返回,就麻烦了.



原帖由 antigloss 于 2007-8-5 21:36 发表
那么,strcpy 没有返回值(void strcpy)和有返回值(char *strcpy)的效率差异呢?你计算了吗?


这种写法的可读性太差了点吧

论坛徽章:
0
28 [报告]
发表于 2007-08-05 21:44 |只看该作者
原帖由 思一克 于 2007-8-5 21:39 发表
如果void strcpy(),那么上面的表达方式就要分开写. 差别就更多了.

你可以自己实验,用一个整体的和分开的,看差多少语句



我的意思是,如果 strcpy 返回 char *,那么要比 void 多些语句吧,那么有返回值的 strcpy 效率要低于没有返回值的 strcpy 了吧?这又该怎么算呢?

论坛徽章:
0
29 [报告]
发表于 2007-08-05 21:52 |只看该作者
知道你的意思了.

strcpy是低层的经过优化的库FUNC(汇编写的). 而CALLER是用户自己写的. 效率方面如果有差别, 用户程序影响更大.

主要还不是考虑效率.

FUNC有返回数值才是正常的, 才可以将FUNC作为表达方式的一部分,或一STATMENT的一部分.

除了我上面例子,还有

printf("%s %d %s\n", strcpy(buf, buf1), 1, str(buf3, buf3));

如果void strcpy, 就麻烦了.

总而言之,FUNC应该返回自己的计算结果(除非结果很大是一个比如结构). 能返回的,一定不要void. 尤其是库FUNC.



原帖由 antigloss 于 2007-8-5 21:44 发表

我的意思是,如果 strcpy 返回 char *,那么要比 void 多些语句吧,那么有返回值的 strcpy 效率要低于没有返回值的 strcpy 了吧?这又该怎么算呢?

论坛徽章:
0
30 [报告]
发表于 2007-08-05 22:03 |只看该作者
copy了string实际是FUNCTION的副作用. (function's side effect).
正作用就是返回dest. 使计算结果可以立即运用于表达式.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP