免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
31 [报告]
发表于 2007-08-05 22:14 |只看该作者
last_str = strcat(strcpy(buf, "1283983983983"), strcat(strcpy(buf1, "aasdfiiioioaoisfioasfio"), "AAAASFDKKBKBKK"));

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

其实效率已经没有了,copy在往上cat,不就做两遍了吗
我觉得就是方便而已,我看过一些代码,但是很少用到strcpy的返回值。 好像用strcpy的都不多,memcpy倒是很多


大家都真的用到strcpy的返回值吗

论坛徽章:
0
32 [报告]
发表于 2007-08-05 22:17 |只看该作者
函数的返回值多一个或几个指令,但是也不至于用这个节省时间吧。程序中通常可能会复制一个大串,而不是频繁的复制一个小串吧

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
33 [报告]
发表于 2007-08-05 22:22 |只看该作者
答案应该是,可以实现所谓的函数调用套函数调用。
反正就tmd一垃圾面试题,面试的时候我要是碰到这种题目,那么这样的面试官我势必是要找个机会羞辱一番。

论坛徽章:
0
34 [报告]
发表于 2007-08-05 22:24 |只看该作者
主要还不是考虑效率.

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

除了我上面例子,还有

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

如果void strcpy, 就麻烦了.

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

copy了string实际是FUNCTION的副作用. (function's side effect).
正作用就是返回dest. 使计算结果可以立即运用于表达式. 比如strcpy(buf, "12345")[1] = 'B';
等等.

论坛徽章:
0
35 [报告]
发表于 2007-08-05 22:51 |只看该作者
他们设计接口的时候,估计考虑效率方面会少一些,因为只是设计接口而不是实现
这样的接口主要还是为了能够函数调用套函数调用

论坛徽章:
0
36 [报告]
发表于 2007-08-05 23:03 |只看该作者
原帖由 cjaizss 于 2007-8-5 22:22 发表
答案应该是,可以实现所谓的函数调用套函数调用。
反正就tmd一垃圾面试题,面试的时候我要是碰到这种题目,那么这样的面试官我势必是要找个机会羞辱一番。



我觉得它本身是很好的一道题,只是现在用滥了而已.
我想第一个考人家这道题的人,现在觉得很恶心.

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
37 [报告]
发表于 2007-08-05 23:10 |只看该作者
这是一种哲学。
基于两种思想:
1,返回值和不返回值效率相差无几。
2,返回了值,可以不用它(返回值),也可以用它。想不用,就不用,想用,也可以,给了用户更多的选择。
而如果不返回值,就只能选择“不用”了,因为你想用也用不着。
总而言之,就是尽可能给用户更多的选择,因为你无法预期用户将来会如何使用你的程序
引用 Perl 界的一句谚语,就是“There is more than one way to do it”。

下面再举个例子:
在 C 或者 Perl 以及其它的一些语言中,赋值运算有返回值,并且该返回值可以参与其它运算。
比如我们经常见到的:
if ( (fp = fopen( "/path/to/foo", "r" )) == NULL ){
}
类似的语句,
就是利用了这一特性。
现在有许多“编程规范”明文禁止这种写法,认为可读性不好,本人也是非常支持的。
然而作为语言本身来讲,它提供这种功能,只是你可以不用它。
和 C/Perl 相反的例子是 Pascal、Basic、Python。
就拿 Python 来说,Python 的作者认为这种做法经常会造成把
if ( ret == -1 ){
}
误写为
if ( ret = -1 ){
}
之后,程序仍然能够继续运行、并且造成难以察觉的错误(类似的讨论本版已经有过多次,许多人提到他们采用把常量写左边的方法。然而,大家都是 C 程序员,因此早就适应了前述的哲学,因而从来没有人想到这其实是因为罪恶的赋值语句返回值造成的错误,-1 == ret 只是亡羊补牢)
在 Python 中,
if ( ret = -1 ) 就是错误的写法,是不能编译运行的,也自然就不会造成 BUG。
我个人非常赞许这一做法。

说到这里,就触摸到了不同哲学之间的冲突问题来了。
有些人认为,我们给用户提供更多的功能,更多的选择,然后由他们决定哪一种才是最好的。并据此进行取舍。
而另一些认为,我们应该仅仅给用户提供最优的功能,然后强制用户采用这种选择,从而避免因为过于自由而带来的各种问题。Python 的强制缩进便是如此:几乎所有的语言都在强调缩进所带来的弊端,然而很少有语言像 Python 这样激进。因此格式混乱的代码在各种语言中都能见到,相比起来 Python 代码就要整齐的多。(自然也就没有资格参加混乱代码大赛了 ^_^)

论坛徽章:
0
38 [报告]
发表于 2007-08-05 23:12 |只看该作者

回复 #4 flw 的帖子

作为一个通用库的调用界面,良好的支持链式表达已经很充分了,无他

论坛徽章:
0
39 [报告]
发表于 2007-08-05 23:16 |只看该作者
>> FUNCTION的设计一般都是取输入参数,计算后返回结果.
>> 有时候,结果也在参数中(也是输入),虽然可以不返回.
>> 总而言之,FUNC应该返回自己的计算结果(除非结果很大是一个比如结构). 能返回的,一定不要void. 尤其是库FUNC.

可见,经过讨论,对返回还是不返回前后观点发生了变化。

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

要说明问题的话,这两个函数也只能说明的是:在 strcpy 返回目的指针的情况下,这两种不同的使用 strcpy 的方式可能会带来效率上的差别(在返回值优化非常普遍的今天,它们的实现其实是相等的),而不能说明你的上述命题正确,因为你的比较中不含 strcpy 返回 void 的情况。

即使你的意思是说 func2 中使用的是返回类型为 void 的 strcpy 函数,即使察看 func1 和 func2 的汇编代码发现 func2 比 func1 多了一条指令,也不能由此就说 func2 效率低于func1——别忘了此时的 strcpy 调用中 func1 中的要比 func2 中的多一条指令,所以综合起来它们的效率其实还是相等。

在实际的代码中,连续拷贝字符串的代码不多见,绝大部分的使用都是忽略 strcpy 函数的返回值的。如果从效率上来考虑它的实现,那么 strcpy 绝对不应该返回任何值,也就是说应该把函数的返回类型设置为 void。(C 是追求效率的语言,但对大多数应用来说,实际上 strcpy 的返回操作是多余的,我认为只能归结于历史原因。)

从上面的分析可以看出:strcpy 返回目的字符串的指针不是出于效率的考虑(恰恰相反,考虑效率的话应该返回 void 而不是多出一个返回操作),而是从易用性上考虑的——这样的实现容易实现字符串的连续拷贝,在某些情况下可能用起来比较方便而已。

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

再返回来看看这句话,就知道说得有些绝对了。其实,如果函数的一个参数是一个指针类型,再将此指针原值作为函数值返回的情况一般并不常见。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
40 [报告]
发表于 2007-08-05 23:18 |只看该作者
原帖由 woshiwo 于 2007-8-5 23:12 发表
作为一个通用库的调用界面,良好的支持链式表达已经很充分了,无他

而链式调用本身就是非常有争议的做法,
因此要不要支持链式调用,
也是值得商榷的。
我的主要观点参考楼上。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP