9.1 不要投机取巧,应致力于编写清晰易懂的程序
类似于以下形式代码:
while('\n' != (*pT++ = *pS++)) {
// …略…
}
9.2 切忌混淆while语句中关系运算符和赋值运算符的优先级
while((c = getchar ()) != EOF) {
putchar(c);
}
9.3 不要进行隐式“非零测试”
9.4 不要在条件表达式中使用赋值语句
9.5 避免产生副作用
“副作用”指程序员意料之外的结果,即运算、控制或调用等偏离程序员预想的方向。C语言中不提供于这种副作用相关的提示消息,而将避免副作用的职能和责任全权交给程序员。
自增自减运算符是这种副作用的最具代表性的示例。
不要投机取巧,尽可能做到简单明确。此时适用的原则就是KISS(Keep It Simple and Short),该原则来源于句法理论。C语言同样是语言之一,也应该遵循这一原则。
9.6 函数原型中也要标注参数的数据类型
布莱恩·克尼汉和丹尼斯·里奇在《C程序设计语言》中最早提出C语言标准,书中称,函数声明时并不要求必须在函数原型中指明数据类型。
#include <stdio.h>
int Team();
void Score();
int Board();
int main(void) {
// …略…
}
以前这种形式的语句时合法语句,但因为无法从中知晓这些函数究竟需要几个什么类型的参数,导致程序模糊不清。程序员不得不查看函数主体部分进行确认。如果不这么做而任意假定参数的数据类型,那么查看main()函数时就无法正确解读程序。
9.7 形式参数也需要命名
9.8 必须标注返回值的数据类型
C语言允许定义未指定返回值的函数,main函数就是典型示例。以前可以如下所示,定义没有明确指定返回值的main函数:
main (...) {
// …略…
}
但这种隐式函数定义方式存在问题,因为无法从中准确知晓该函数将返回何种值。正常处理情况下通常返回0,其他情况则返回0以外的其他数值。但编译器的这种自动处理的返回流程并不可信,因为有些编译器可能并不遵循这套处理方式。比如,有些编译器返回函数地址,还有些未成形的编译器会返回处理后的局部变量地址。
9.9 留意结果值
以C语言种的标准函数strcmp()为例,该函数用于比较两个字符串,如果两者相同则返回0。
if (strcmp (string1, string2))
printf("两个字符串相同。\n");
else
printf("两个字符串不同。\n");
这段代码好像有点问题。编写该代码的程序员似乎做出了如下假定:调用某些函数时,如果调用结果是“乐观的”,则对应真值的返回值为1.此处“乐观的”指的是两个字符串相同,因为程序员将strcmp()函数视为比较两个值是否相同的函数。并由此认为,如果两个值相同,即结果“乐观”,那么理所当然返回1。
因此,程序员使用strcmp()函数时,必须进行如下3种操作:
- 查看手册或函数说明书,确认两个字符串相同时的返回值。
- 使用strcmp()时添加注释,记录其返回值。
- 比较strcmp()函数的返回值时,务必使用逻辑运算符明确表示。
总之,各位必须牢记,C语言所有运算、调用、控制过程种,真值并不一定始终返回1。因此,必须仔细查看手册,并在代码中用注释和关系运算符做出明确标注。
9.10 在for语句等条件表达式中谨慎运算
9.11 大量使用冗余括号
常用于do...while()语句中
9.12 如果else语句使用大括号,那么if语句也应该使用
9.13 函数末尾务必编写return语句
即使函数的返回值数据类型为void,也要编写return语句。
网友评论