购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.8 C程序的书写规范

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

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

是由7个记号组成的:

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

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

大多数情况下,程序中记号之间的空格数量没有严格要求。除非两个记号合并后会产生第三个记号,否则在一般情况下记号之间根本不需要留有间隔。例如,可以删除2.6节的程序celsius.c中的大多数间隔,只保留诸如 int main 之间以及 float fahrenheit 之间的空格。

/* 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语言允许在记号之间插入任意数量的间隔,这些间隔可以是空格符、制表符和换行符。这一规则对于程序布局有如下积极意义。

2.6节中的程序celsius.c体现了上面提到的几种布局方法。我们来仔细阅读一下这个程序中的 main 函数:

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) 声明变量 fahrenheit celsius ;(2) 获取华氏温度;(3) 计算变量 celsius 的值;(4) 显示摄氏温度;(5) 返回操作系统。

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

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

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

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

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

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

把字符串从一行延续到下一行(➤13.1节)需要一种特殊的方法才可以实现。这种方法将在稍后的章节中学到。 m1pBNqgHSWd+N29wMmp2oPav/106s4orrCyqc9VGxmQyBCyrrdV1zl492c530PlN

点击中间区域
呼出菜单
上一章
目录
下一章
×