本文为我的读书笔记,仅供记录学习过程当中遇到的往后须要留意的问题,若有相关版权问题请及时通知做者。
编码风格
一、每个函数都必须有注释。
头部说明须要包含的内容和次序
二、每一个函数定义结束以后以及每一个文件结束以后都要加一个或若干个空行
三、在一个函数体内,变量定义与函数语句之间要加空行
四、逻辑上密切相关的语句之间不加空行,其它地方应加空行分隔。
五、复杂的函数中,循环语句结束以后须要适当的注释,方便区分各分支或循环体
六、修改别人代码的时候不要轻易删除别人的代码,应该用适当的注释方式
七、用缩行显示程序结构,缩进量统一4个字符,不适用TAB缩进。
八、在函数体的开始、结构/联合的定义、枚举的定义以及循环、判断等语句中的代码都要采用缩行。
九、同层次的代码在同层次的缩进层上
十、最大长度控制在80个字符之内,较长的语句、表达式要分多行书写
十一、长表达式要在低优先级操做符处划分新行,操做符放在新行之首。拆分出来的新行要进行适当的缩进,使排整齐。
十二、若是函数中的参数较长,要进行适当的划分。
1三、用正确的反义词组命名具备互斥意义的变量或相反动做的函数
1四、若是代码行中的运算符比较多,用括号肯定表达式的操做顺序,避免使用默认的优先级。
1五、不要编写太复杂的符合表达式
1六、不要有多用途的符合表达式
1七、尽可能避免含有否认运算符的条件表达式
1八、参数的书写要完整,不要省略参数名。若是函数没有参数,则用void填充。
函数设计的通常原则和技巧
1九、少用全局变量。各个源文件负责自己文件的全局变量,同时提供一对对外函数,方便其余函数使用该函数来访问变量。不要直接读写全局变量,尤为是在多线程编程时,必须使用set/get的方式,而且对读写操做加锁。
20、参数命名要恰当、顺序要合理。通常应将目的参数放在前面,源参数放在后面
2一、若是参数是指针,且仅做输入参数用,则应在类型前加const,方式该指针在函数体内被意外修改。
2二、不要省略返回值的类型,若是函数没有返回值,那么应声明为void类型。若是没有返回值,编译器则默认函数的返回值是int类型的。
2三、在函数体的入口处,对参数的有效性进行检查,尤为是指针参数,尽可能使用assert宏做入口校验,而不使用if语句校验。
2四、return语句不可返回指向栈内存的指针,由于该内存在函数体结束时被自动销毁。
2五、函数的功能要单一,不要涉及多用途的函数。
2六、函数体的规模要效,尽可能控制在80行之内。
2七、相同的输入应当产生相同的输出。尽可能避免函数带有记忆功能。带有记忆功能的函数其行为是不可预测的,由于他的行为可能取决于某种记忆状态。这样的函数不利于测试和维护。在C语言中,函数的static局部变量是函数的记忆存储器。尽可能少使用static,除非必须。
2八、避免函数有太多的参数,尽可能控制在4个之内。
2九、尽可能不要使用类型和数目不肯定的参数。
C标准库函数printf是采用不肯定参数的典型表明,函数原型:
int printf(const chat *format[,argument]……);
这种风格的函数在编译时丧失了严格的类型安全检查。
30、有时候函数不须要返回值,单位了增长灵活性如支持链式表达,能够附加返回值。
3一、不只要检查输入参数的有效性,还要检查经过其余途径进入函数体内的变量的有效性,如全局变量、文件句柄等。
3二、函数名与返回值类型在语义上不可冲突
违反的典型表明是 getchar。其返回值是int型,函数原型:
int getchar(void);
如:
char c
;
c = getchar();
if(EOF == c)
{
…
}
char型的取值范围是[-128,127],若是宏EOF的值在char的取值范围以外,EOF的值将没法所有保存到c内,会发生截断,将EOF值的低8位保存到c里。这样if语句有可能老是失败。
递归调用
尽可能不要用递归。要用的时候注意递归层次不要太深,防止栈溢出;递归的中止条件必定要正确,不然,递归可能没完没了。