我们可以把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语言允许在记号之间插入任意数量的间隔,这些间隔可以是空格符、制表符和换行符。这一规则对于程序布局有如下积极意义。
语句可以分开 放在任意多行内。例如,下面的语句非常长,很难将它压缩在一行内:
printf("Dimensional weight (pounds): %d\n",
(volume + INCHES_PER_POUND - 1) / INCHES_PER_POUND);
记号间的空格 使我们更容易区分记号。基于这个原因,我通常会在每个运算符的前后都放上一个空格:
volume = height * length * width;
此外,我还会在每个逗号后边放一个空格。某些程序员甚至在圆括号和其他标点符号的两边都加上空格。
缩进
有助于轻松识别程序嵌套。
例如,为了清晰地表示出声明和语句都嵌套在
main
函数中,应该对它们进行缩进。
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节)需要一种特殊的方法才可以实现。这种方法将在稍后的章节中学到。