今天我看到一篇老帖子,是名字为 写程序是一种态度(一)strcmp http://blog.csdn.net/swguru/archive/2002/08/05/17174.aspx
觉得文章后面的几个问题很值得思考,于是想联系作者,询问正确答案看自己思考的是否正确全面,
可是点击发送邮件,却发送不出去,没办法只要跑到那篇文章下面发表评论,可是一连点了几次都提示
验证码错误(好象我还没白痴到几个数字字母都识别不出来,输错的地步)
不知道大家是否也遇到同样的问题。希望管理员能清查下此类故障,给我们提供一个良好的交流环境。
另附 问题和答案,希望得到大家和作者的帮助。
问题:
分析经典代码是一种最佳方式,我将从最简单但又最绝妙的开始:strcmp
int __cdecl strcmp (
const char * src,
const char * dst
)
{
int ret = 0 ;
while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)
++src, ++dst;
if ( ret < 0 )
ret = -1 ;
else if ( ret > 0 )
ret = 1 ;
return( ret );
}
这是MS C run-time中的strcmp实现源码。几个问题将揭示它的精髓,会对我们写出相应功能的高质量代码提供指导。
1.src和dst都为空串如何返回?
2.为什么要用unsigned char*强制转换?
3.可否用*src替换*dst作为while条件?
4.是否是multithread-safe?
5.能否用于multibyte-character strings的比较?
6.能否用更少行表达?
我的理解为:
问题1是返回0值(即相等)
问题2应该是为了避免出现有符合和无符号字符型数据相减(可是有这种可能吗,这里搞不懂,请指教)
问题3应该是可以替换
问题4应该是不是
问题5为不能
问题6应该可以吧。(如 while( ! (ret = *(unsigned char *)src++ - *(unsigned char *)dst++) && *dst)
还有一个问题就是这个函数怎么没考虑实参为NULL的时候?而且我特意在VC6中试验过,如果其值为NULL会非法,可是自己又怀疑微软的程序员不会犯这种错误。