C和指针:良好的程序风格和文档将使程序更容易阅读和维护( 三 )


? 在书写连续多个问号时使用,防止它们被解释为三字母词 。
" 用于表示一个字符串常量内部的双引号 。
' 用于表示字符常量 ' 。
\ 用于表示一个反斜杠,防止它被解释为一个转义序列符 。
有许多字符并不在源代码中出现,但它们在格式化程序输出或操纵终端显示屏时非常有用 。C语言也提供了一些这方面的转义符,方便你在程序中包含它们 。在选择这些转义符的字符时,特地考虑了它们是否有助于记忆它们代表的字符的功能 。
K&R C:

下面的转义符中,有些标以“†”符号,表示它们是ANSI C新增的,在K&R C中并未实现 。
 
a † 警告字符 。它将奏响终端铃声或产生其他一些可听见或可看见的信号 。
b 退格键 。
f 进纸字符 。
n 换行符 。
r 回车符 。
t 水平制表符 。
v † 垂直制表符 。
ddd ddd表示1~3个八进制数字 。这个转义符表示的字符就是给定的八进制数值所代表的字符 。
xddd † 与上例类似,只是八进制数换成了十六进制数 。
注意,任何十六进制数都有可能包含在xddd序列中,但如果结果值的大小超出了表示字符的范围,其结果就是未定义的 。
2.2.2 注释C语言的注释以字符/*开始,以字符*/结束,中间可以包含除*/之外的任何字符 。在源代码中,一个注释可能跨越多行,但它不能嵌套于另一个注释中 。注意,/*或*/如果出现在字符串字面值内部,就不再起注释定界符的作用 。
所有的注释都会被预处理器拿掉,取而代之的是一个空格 。因此,注释可以出现于任何空格可以出现的地方 。
警告:
注释从注释起始符/开始,到注释终止符/结束,其间的所有东西均作为注释的内容 。这个规则看上去一目了然,但对于编写了下面这段看上去很无辜的代码的学生而言,情况就不一定如此了 。你能看出来为什么只有第1个变量才被初始化吗?
x1=0; /***********************x2=0; **Initialize the**x3=0; **counter variables. **x4=0; ***********************/警告:
注意中止注释用的是*/而不是*? 。如果你击键速度太快或者按住shift键的时间太长,就可能误输入为后者 。这个错误在指出来以后是一目了然,但在现实的程序中这种错误却很难被发现 。
2.2.3 自由形式的源代码C是一种自由形式的语言,也就是说并没有规则规定什么地方可以书写语句,一行中可以出现多少条语句,什么地方应该留下空白以及应该出现多少空白等[2] 。唯一的规则就是相邻的标记之间必须出现一至多个空白字符(或注释),不然它们可能被解释为单个标记 。因此,下列语句是等价的:
y=x+1;y = x + 1;y = x+1至于下面这组语句,前3条语句是等价的,但第4条语句却是非法的:
intx;intx;int/*comment*/x;intx;这种代码书写的极度自由有利有弊 。很快你就将听到一些关于这个话题的肥皂盒哲学 。
2.2.4 标识符标识符(identifier)就是变量、函数、类型等的名字 。它们由大小写字母、数字和下划线组成,但不能以数字开头 。C是一种大小写敏感的语言,所以abc、Abc、abC和ABC是4个不同的标识符 。标识符的长度没有限制,但标准允许编译器忽略第31个字符以后的字符 。标准同时允许编译器对用于表示外部名字(也就是由链接器操纵的名字)的标识符进行限制,只识别前六位不区分大小写的字符 。
下列C语言关键字是被保留的,它们不能作为标识符使用:
autodogotosignedunsignedbreakdoubleifsizeofvoidcaseelseintstaticvolatilecharenumlongstructwhileconstexternregister switchcontinue floatreturntypedefdefaultforshortunion2.2.5 程序的形式一个C程序可能保存于一个或多个源文件中 。虽然一个源文件可以包含超过一个的函数,但每个函数都必须完整地出现于同一个源文件中[3] 。标准并没有明确规定,但一个C程序的源文件应该包含一组相关的函数,这才是较为合理的组织形式 。这种做法还有一个额外的优点,就是它使实现抽象数据类型成为可能 。
2.3 程序风格这里按顺序列出了一些有关编程风格的评论 。像C这种自由形式的语言很容易产生邋遢的程序,就是那种写起来很快很容易但以后很难阅读和理解的程序 。人们一般凭借视觉线索进行阅读,所以你的源代码如果井然有序,将有助于别人以后阅读(阅读的人很可能就是你自己) 。程序2.1就是一个例子,虽然有些极端,但它说明了这个问题 。这是一个可以运行的程序,执行一些多少有点用处的功能 。问题是,你能明白它是干什么的吗[4]?更糟的是,如果你要修改这个程序,该从何处着手呢?尽管,如果时间充裕,经验丰富的程序员能够推断出它的意思,但恐怕很少会有人乐意这么干 。把它扔在一边,自己从头写一个要方便快速得多 。


推荐阅读