三个C语言小程序
梅林mlnin@163
我真正开始用C语言写单片机程序,还是这个学期的事情。我的第一个写的稍微有点长的C语言程序是用PROTEUS仿真的一个12864液晶驱动程序,实现了一些基本操作,如显示汉字,显示位图,画直线,屏幕取反,滚动显示等功能。自那以后就发觉自己是爱上C语言了,以至于现在一看到汇编就烦。
之后的一段时间,我天天在网上各种C语言的文章来看。我陆续看到了三个非常有启发性的C语言小程序,当我第一次看到这样的程序时,心里久久不能平静。下面我按顺序把这三个程序贴出来,和大家一起分享。
有一天在一个论坛上看到了下面的这段内容。
请写一个strcpy的标准函数。您的答案若是:
void strcpy( char *strDest, char *strSrc )
{
while( (*strDest++ = * strSrc++) != ‘\0’ );
}
当我看到这里时,心里还在想,写的真好,一条语句就搞定了。继续往下看,
很遗憾,您的程序只能拿到E。看看拿A的strcpy:
char * strcpy( char *strDest, const char *strSrc )
{
assert( (strDest != NULL) && (strSrc != NULL) );
char *address = strDest;
while( (*strDest++ = * strSrc++) != ‘\0’ );
return address;
}c编程网站
当我看到这里时,心里在想assert啥意思啊?为啥还要返回一个地址啊?用不着这么复杂吧!继续,
这个程序考虑了什么?
(1)程序要强大:为了实现链式操作,将目的地址返回,函数返回类型改为char *
(2)程序要可读:源字符串指针参数加const限制,表明为输入参数
(3)程序要健壮:验证strDest和strSrc非空
我愣了好久!
关于assert函数,我当时在网上随便查了一下,也没太在意。后来在曾生伟拷给我的C语言资料里面到《编写无错C程序秘诀(Writing Clean Code)》这本书。书的第二章详细讲了这个函数(截图如下),不过我还是没有仔细去看,感觉现在还用不上吧,心里有个底就行了!
关于strcpy标准函数的故事还没完。
后来我又看到了一本书,这本书是林锐博士写的《高质量C++和C 编程指南》。在这本书的开头有这样
一段话,截图如下:
题目,截图如下:
再来说说第二个C语言小程序,这个程序我是在《C陷阱与缺陷》这本书上看到的。在这本书的导读部分举了下面这样一个例子(相信大家一眼就看出问题来了)。但问题的重点不是这里。重点在于,为什么这段程序在很多编译器中,会陷入死循环呢?我当时也是尝试着不看答案,看看自己能否想的出来。显然我是失败了!
解释如下:
呵呵,这个程序不错吧。程序虽然简单,蕴含的道理可不简单!!!