《C语言接口与实现:创建可重用软件的技术》一1.2 程序设计风格

简介:

本节书摘来自异步社区《C语言接口与实现:创建可重用软件的技术》一书中的第1章,第1.2节,作者 傅道坤,更多章节内容可以访问云栖社区“异步社区”公众号查看

1.2 程序设计风格

double说明了本书中程序所使用的风格惯例。程序能否更容易被阅读并理解,比使程序更容易被计算机编译更为重要。编译器并不在意变量的名称、代码的布局或程序的模块划分方式。但这种细节对程序员阅读以及理解程序的难易程度有很大影响。

本书代码遵循C程序的一些既定的风格惯例。它使用一致的惯例来命名变量、类型和例程,并在本书的排版约定下,采用一致的缩进风格。风格惯例并非是一种必须遵循的刚性规则,它们表示的是程序设计的一种哲学方法,力求最大限度地增加程序的可读性和可理解性。因而,凡是改变惯例能有助于强调代码的重要方面或使复杂的代码更可读时,你完全可以违反“规则”。

一般来说,较长且富于语义的名称用于全局变量和例程,而数学符号般的短名称则用于局部变量。代码块〈compute x • y〉中的循环索引i属于后一种惯例。对索引和变量使用较长的名称通常会使代码更难阅读,例如下述代码中

sum = 0; 
for (theindex = 0; theindex < numofElements; theindex++) 
  sum += x[theindex]*y[theindex];

长变量名反而使代码的语义含混不清。

变量的声明应该靠近于其第一次使用的地方(可能在代码块中)。linenum的声明很靠近在getword中首次使用该变量的地方,这就是个例子。在可能的情况下,局部变量的声明在使用变量的复合语句的开始处。例如,代码块〈copy the word into buf[0..size-1] 5〉中对i的声明。

一般来说,过程和函数的名称,应能反映过程完成的工作及函数的返回值。因而,getword应当返回输入中的下一个单词,而doubleword则找到并显示出现两次或更多次的单词。大多数例程都比较简单,不会超过一页代码,代码块更短,通常少于12行。

代码中几乎没有注释,因为围绕对应代码块的正文代替了注释。有关注释风格的建议几乎会引发程序员间的战争。本书将效法C程序设计方面的典范,最低限度地使用注释。如果代码很清晰,且使用了良好的命名和缩进惯例,则这样的代码通常是含义自明的。仅当进行解释时(例如,解释数据结构的细节、算法的特例以及异常情况)才需要注释。编译器无法检查注释是否与代码一致,误导的注释通常比没有注释更糟糕。最后,有些注释只不过是一种干扰,其中的噪音和过多的版式掩盖了注释内容,从而使这些注释只会掩盖代码本身的含义。

文学编程避免了注释战争中的许多争论,因为它不受程序设计语言注释机制的约束。程序员可以使用最适合于表达其意图的任何版式特性,如表、方程、图片和引文。文学编程似乎提倡准确、精确和清晰。

本书中的代码以C语言编写,它所使用的大多数惯用法通常已被有经验的C程序员所接受并希望采用。其中一些惯用法可能使不熟悉C语言的程序员困惑,但为了能用C语言流利地编程,程序员必须掌握这些惯用法。涉及指针的惯用法通常是最令人困惑的,因为C语言为指针的操作提供了几种独特且富有表达力的运算符。库函数strcpy将一个字符串复制到另一个字符串中并返回目标字符串,对该函数的不同实现就说明了“地道的C语言”和新手C程序员编写的代码之间的差别,后一种代码通常使用数组:

char *strcpy(char dst[], const char src[]) {
  int i; 

  for (i = 0; src[i] != '\0'; i++) 
             dst[i] = src[i]; 
  dst[i] = '\0'; 
  return dst; 
}

“地道”的版本则使用指针:

char *strcpy(char *dst, const char *src) { 
  char *s = dst; 

  while (*dst++ = *src++)
  ; 
  return s; 
}

这两个版本都是strcpy的合理实现。指针版本使用通常的惯用法将赋值、指针递增和测试赋值操作的结果合并为单一的赋值表达式。它还修改了其参数dst和src,这在C语言中是可接受的,因为所有参数都是传值的,实际上参数只不过是已初始化的局部变量。

还可以举出很好的例子,来表明使用数组版本比指针版本更好。例如,所有程序员都更容易理解数组版本,无论他们能否使用C语言流畅地编程。但指针版本是最有经验的C程序员会编写的那种代码,因而程序员阅读现存代码时最有可能遇到它。本书可以帮助读者学习这些惯用法、理解C语言的优点并避免易犯的错误。

相关文章
|
26天前
|
编译器 开发工具 C语言
【C语言】第一回(源(.c)文件怎么生成可执程序(.exe)文件)
【C语言】第一回(源(.c)文件怎么生成可执程序(.exe)文件)
|
27天前
|
存储 编译器 C语言
深入探索C语言动态内存分配:释放你的程序潜力
深入探索C语言动态内存分配:释放你的程序潜力
28 1
|
1月前
|
C语言
最简单的C语言程序示例
最简单的C语言程序示例
21 0
|
1月前
|
Serverless C语言
C语言程序通常具有以下基本结构
C语言程序通常具有以下基本结构
10 0
|
1月前
|
C语言 C++
第一个c语言程序
第一个c语言程序
|
8天前
|
存储 自然语言处理 编译器
振南技术干货集:振南当年入门C语言和单片机的那些事儿(3)
振南技术干货集:振南当年入门C语言和单片机的那些事儿(3)
|
22天前
|
存储 编译器 C语言
深入探索C语言动态内存分配:释放你的程序潜力
深入探索C语言动态内存分配:释放你的程序潜力
30 0
|
1月前
|
C语言
C语言最基本程序控制结构
C语言最基本程序控制结构
15 0
|
1天前
|
C语言
(浙大版《C语言程序设计(第3版)》 习题6-5 使用函数验证哥德巴赫猜想 (20分)
(浙大版《C语言程序设计(第3版)》 习题6-5 使用函数验证哥德巴赫猜想 (20分)
|
8天前
|
存储 移动开发 Shell
振南技术干货集:C语言的一些“骚操作”及其深层理解(2)
振南技术干货集:C语言的一些“骚操作”及其深层理解(2)