第17章风格第17章风格

第17章风格第17章风格

ID:4127258

大小:290.83 KB

页数:5页

时间:2017-11-29

第17章风格第17章风格_第1页
第17章风格第17章风格_第2页
第17章风格第17章风格_第3页
第17章风格第17章风格_第4页
第17章风格第17章风格_第5页
资源描述:

《第17章风格第17章风格》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、192第17章风格第17章风格计算机程序并不仅仅是写来供计算机处理的,它也会用来供其他的程序员阅读。为了提高程序的可读性(和可维护性及减少程序的错误),除了让编译器接受之外,还得有些额外的考量。风格上的考虑是计算机程序设计中最不具有客观性的方面:关于代码风格的观点,就像门派之争一样,可以无休无止地辩论下去。良好的风格是个有价值的目标,这点通常也被广泛认可。但要严格规定它却也不能。无论如何,缺乏良好风格的客观标准乃至业界的共识并不意味着程序员就可以放弃对程序可读性的关注和努力。17.1问:什么是C最好的代码布局风格?答:Kernigh

2、an和Ritchie提供了最常被复用的范例,但同时他们并不要求大家沿用他们的风格。大括号的位置并不重要,尽管人们对此怀有执着的热情。我们在几种流行的风格中选了一种。选一个适合你的风格,然后坚持使用这一风格。保持布局风格跟自己、其他人及通用源码的一致性比使之“完美”更重要。如果你的编码环境(本地习惯或公司政策)没有建议一个风格,而你也不想发明自己的风格,当然可以沿用K&R的风格。几种流行的风格各有优缺点。将左括号独立放在一行会浪费垂直空间;把它跟下一行结合会难以编辑;跟上一行结合又会导致它和右括号不能对齐,从而更难看到。每级缩进8列最

3、常见,但常常又会让你太接近右边界(这可能也暗示你该分解一下你的函数了)而很不舒服。如果缩进一个tab但把tab值设定为8以外的值,你就得要求其他人用跟你一样的软件设置来阅读你的代码。参见文献[23]。“好风格”的品质并不简单,它包含的内容远远不止代码的布局细节。不要把时间都花在格式上而忽略了更实质性的代码本身的质量。参见问题17.2。第17章风格193参考资料:[18,Sec.1.2p.10]1[19,Sec.1.2p.10]217.23问:如何在源文件中合理分配函数?4答:通常,相关的函数放在同一个文件中。有时候(例如开发库的时候

4、),一个源文件(自然也5就是一个目标文件)放一个函数比较合适。有时候,尤其是对某些程序员,太多的源文件可能会很麻烦,将多数以至所有的程序都放入少数几个大的源文件中也很诱人,甚至也是合适的。6希望用static关键字限制某些函数或全局变量的作用域时,源文件的分配就有更多限制了:静7态函数和变量以及共享它们的函数都必须在同一个源文件中。换言之,这里有些权衡,因此很难给出一般的规则。参见问题1.7、1.9、10.6和10.7。817.39问:用if(!strcmp(s1,s2))比较两个字符串是否相等是个好风格吗?10答:这并不是个很好的

5、风格,尽管这是个流行的习惯用法。如果两个字符串相等,这个测试返回11真,但!(“非”)的使用容易引起误会,以为测试不相等情况。12另一个选择是定义一个宏:#defineStreq(s1,s2)(strcmp((s1),(s2))==0)13然后这样使用:if(Streq(s1,s2))14另一种选择(可以防止宏的滥用,参见问题10.2)是定义15#defineStrRel(s1,op,s2)(strcmp(s1,s2)op0)然后你可以这样使用:16if(StrRel(s1,==,s2))...if(StrRel(s1,!=,s2)

6、)...17if(StrRel(s1,>=,s2))...参见问题17.10。1817.419问:为什么有的人用if(0==x)而不是if(x==0)?20194第17章风格答:这是用来防止一个常见错误的小技巧:if(x=0)如果你养成了把常量放在==前面的习惯,那么当你意外地把代码写成了:if(0=x)编译器就会报错。显然,一些人会觉得记住倒转测试比记住输入两个=号容易。(的确,就算是经验老道的程序员有时也会错把==写成=。)当然这个技巧只对和常量比较的情况有用。另一方面,有的人又觉得这样倒转的测试既难看又影响注意力,因而提出应该

7、让编译器对if(x=0)报警。(实际上,很多编译器的确对条件式中的赋值报警,当然如果你真的需要,你总是可以写if((x=expression))或if((x=expression)!=0)。参考资料:[11,Sec.7.6.5pp.209-210]17.5问:为什么有些代码在每次调用printf前增加了类型转换(void)?答:printf确实有返回值(输出的字符个数或错误码),但几乎没有谁会去检验每次调用的返回值。由于有些编译器和lint对于被丢弃的返回值会报警告,显式地用(void)作类型转换相当于说:“我决定忽略这次调用的返回

8、值,请继续对于其他(也许不慎)忽略返回值的情况提出警告”。通常,(void)类型转换也用于strcpy和strcat的调用,它们的返回值从没有什么惊人之处。参考资料:[19,Sec.A6.7p.199][14,Sec.3.3.4][1

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。