电子芯吧客盘点!各路大神的C语言编程建议和技巧


我们鼓励在编程时应有清晰的哲学思维 , 而不是给予硬性规则 。 我并不希望你们能认可所有的东西 , 因为它们只是观点 , 观点会随着时间的变化而变化 。 可是 , 如果不是直到现在把它们写在纸上 , 长久以来这些基于许多经验的观点一直积累在我的头脑中 。 因此希望这些观点能帮助你们 , 了解如何规划一个程序的细节 。 (我还没有看到过一篇讲关于如何规划整个事情的好文章 , 不过这部分可以是课程的一部分)要是能发现它们的特质 , 那很好;要是不认同的话 , 那也很好 。 但如果能启发你们思考为什么不认同 , 那样就更好了 。 在任何情况下 , 都不应该照搬我所说的方式进行编程;要用你认为最好的编程方式来尝试完成程序 。 请一以贯之而且毫不留情的这么做 。
01
排版问题
程序是一种出版物 。 意味着程序员们会先阅读(也许是几天、几周或几年后的你自己阅读) , 最后才轮到机器 。 机器的快乐就是程序能编译 , 机器才不在乎程序写的有多么漂亮 , 可是人们应该保持程序的美观 。 有时人们会过度关心:用漂亮的打印机呆板地打印出漂亮的输出 , 而这些输出只是将所有介词用英文文本以粗体字体凸显出来 , 都是些与程序无关的细节 。 虽然有很多人认为程序就应该像 Algol.68 所描述的一样(有些系统甚至要求照搬该风格编写程序) , 可清晰的程序不会因为这样的呈现而变得更清晰 , 只会使糟糕的程序变得更可笑 。
【电子芯吧客盘点!各路大神的C语言编程建议和技巧】对于清晰的程序来说 , 排版规范一向都是至关重要的 。 当然 , 众所周知最有用的是缩进 , 但是当墨水遮盖了意图时 , 就会控制住排版 。 因此即便坚持使用简单的旧打字机输出 , 也该意识到愚蠢的排版 。 避免过度修饰 , 比如保持注释的简洁和灵活 。 通过程序整齐一致地说出想表达的 。 接着往下看 。
02
变量命名
对于变量名称 , 长度并不是名称的价值所在 , 清晰的表达才是 。 不常用的全局变量可能会有一个很长的名称 , 像 maxphysaddr 。 在循环中每一行所使用的数组索引 , 并不需要取一个比 i 更详尽的名字 。 取 index 或者 elementnumber 会输入更多的字母(或调用文本编辑器) , 并且会遮盖住计算的细节 。 当变量名称很长时 , 很难明白发生了什么 。 在一定程度上 , 这是排版问题 , 看看下面
vs.
现实例子中的问题会变得更糟 。 所以仅需把索引当成符号来对待 。
指针也需要合理的符号 。 np 仅仅只是作为指针 nodepointer 的助记符 。 如果一贯都遵从命名规范 , 那么很容易就能推断出 np 表示“节点指针” 。 在下一篇文章中会提到更多 。
同时在编程可读性的其它方面 , 一致性也是极其重要的 。 假使变量名为 maxphysaddr , 则不要给同级关系的变量取名 lowestaddress 。
最后 , 我倾向于「最小长度」但「最大信息量」的命名 , 并让上下文补齐其余部分 。 例如:全局变量在使用时很少有上下文帮助理解 , 那么它们的命名相对而言更需要令人易懂 。 因此我称 maxphyaddr 作为一个全局变量名 , 对于在本地定义和使用的指针来说 np 并不一定是 NodePoint 。 这是品味的问题 , 但品味又与清晰度相关 。
我避免在命名时嵌入大写字母;它们的阅读舒适性太别扭了 , 像糟糕的排版一样令人心烦 。
03
指针的使用
C语言不同寻常 , 因为它允许指针指向任何事物 。 指针是锋利的工具 , 像任何这样的工具一样 , 使用得当可以产生令人愉悦的生产力 , 但使用不当也可以造成极大的破坏 。 指针在学术界的名声不太好 , 因为它太危险了 , 莫名其妙地就变得糟糕的不行 。 但我认为它是强大的符号 , 它可以帮助我们清楚地自我表达 。
思考:当有指针指向对象时 , 对于那个对象 , 确切地说它只是名称 , 其它什么也不是 。 听起来很琐碎 , 但看看下面的两个表达式:


推荐阅读