C 程序的书写规范

目录汇总:C 语言入门教程:面向萌新小白的零基础入门教程

我们可以把 C 程序看成是一连串记号(token),即许多在不改变意思的基础上无法再分割的字符组。标识符和关键字都是记号。像 +- 这样的运算符、逗号和分号这样的标点符号以及字符串字面量,也都是记号。例如,语句

1
printf( "Height: %d\n", height);

是由 7 个记号组成的:

printf   (   "Height: %d\n"   ,    height   )   ;
   ①     ②          ③         ④       ⑤     ⑥   ⑦

其中记号 ① 和 ⑤ 记号都是标识符,记号 ③ 是字符串字面量,而记号 ②、记号 ④、记号 ⑥ 和记号 ⑦ 则是标点符号。

大多数情况下,程序中记号之间的空格数量没有严格要求。除非两个记号合并后会产生第三个记号,否则在一般情况下记号之间根本不需要留有间隔。例如,可以删除 C 语言定义常量的名字 中的程序 celsius.c 中的大多数间隔,而只保留诸如 intmain 之间以及 floatfahrenheit 之间的空格。

1
2
3
4
5
6
7
8
/* Converts a Fahrenheit temperature to Celsius */
#include <stdio.h>
#define FREEZING_PT 32.0f
#define SCALE_FACTOR (5.0f/9.0f)
int main(void){float fahrenheit,celsius;printf(
"Enter Fahrenheit temperature:");scanf("%f",  &fahrenheit);
celsius=(fahrenheit-FREEZING_PT)*SCALE_FACTOR;
printf("Celsius equivalent: %.1f\n", celsius);return 0;}

事实上,如果这个页面再宽一些,可以将整个 main 函数都放在一行中。但是,不能把整个程序写在一行内,因为每条预处理指令都要求独立成行。

当然,用这种方式压缩程序并不是个好主意。事实上,添加足够的空格和空行可以使程序更便于阅读和理解。幸运的是,C 语言允许在记号之间插入任意数量的间隔,这些间隔可以是空格符、制表符和换行符。这一规则对于程序布局有如下积极意义。

  • 语句可以分开放在任意多行内。例如,下面的语句非常长,很难将它压缩在一行内:

    1
    2
    
    printf("Dimensional weight (pounds): %d\n",
    (volume + INCHES_PER_POUND - 1) / INCHES_PER_POUND);
    
  • 记号间的空格使我们更容易区分记号。基于这个原因,我通常会在每个运算符的前后都放上一个空格:

    1
    
    volume = height * length * width;
    

    此外,我还会在每个逗号后边放一个空格。某些程序员甚至在圆括号和其他标点符号的两边都加上空格。

  • 缩进有助于轻松识别程序嵌套。例如,为了清晰地表示出声明和语句都嵌套在 main 函数中,应该对它们进行缩进。

  • 空行可以把程序划分成逻辑单元,从而使读者更容易辨别程序的结构。就像没有章节的书一样,没有空行的程序很难阅读。

C 语言定义常量的名字 中的程序 celsius.c 体现了上面提到的几种布局方法。我们来仔细阅读一下这个程序中的 main 函数:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
int main(void)
{
  float fahrenheit, celsius;

  printf("Enter Fahrenheit temperature: ");
  scanf("%f", &fahrenheit);

  celsius = (fahrenheit - FREEZING_PT) * SCALE_FACTOR;

  printf("Celsius equivalent: %.1f\n", celsius);

  return 0;
}

首先,观察一下运算符 =-* 两侧的空格是如何使这些运算符凸现出来的;其次,留心为了明确声明和语句属于 main 函数,如何对它们采取缩进格式;最后,注意如何利用空行将 main 划分为 5 部分:(1)声明变量 fahrenheitcelsius,(2)获取华氏温度,(3)计算变量 celsius 的值,(4)显示摄氏温度,(5)返回操作系统。

在讨论程序布局问题的同时,还要注意一下记号 { 和记号 } 的放置方法:记号 { 放在了 main() 的下面,而与之匹配的记号 } 则放在了独立的一行中,并且与记号 { 排在同一列上。把记号 } 独立放在一行中可以便于在函数的末尾插入或删除语句,而将记号 } 与记号 { 排在一列上是为了便于找到 main 函数的结尾。

最后要注意的是:虽然可以在记号之间添加额外的空格,但是绝不能在记号内添加空格,因为这样做可能会改变程序的意思或者引发错误。如果写成

1
fl oat fahrenheit, celsius;   /*** WRONG ***/

1
2
fl
oat fahrenheit, celsius;      /*** WRONG ***/

在程序编译时会报错。尽管把空格加在字符串字面量中会改变字符串的意思,但这样做是允许的。然而,把换行符加进字符串中(换句话说,就是把字符串分裂成两行)却是非法的:

1
2
printf("To C, or not to C:
that is the question.\n");    /*** WRONG ***/

把字符串从一行延续到下一行需要一种特殊的方法才可以实现。

(完)

comments powered by Disqus