编程小Tip

来源:互联网 发布:hadoop 8020端口 编辑:程序博客网 时间:2024/05/16 17:19
  1. 假如这个程序的源代码中由几个源文件组成,那么使用该函数的源文件都必须写明该函数的原型。把原型放在头文件中并使用#include指令包含他们,可以避免由于同一个声明的的多份拷贝而导致的维护性问题。
  2. 编程过程中,恰当的使用空行和Tab缩进,可以大大提高代码的可读性。
  3. 如今软件开销的最大之处并非在于编写,而是在于维护。在修改一段代码时所遇到的第一个问题就是搞清楚代码的功能。所以,如果你在代码中插入一些东西,能使其他人(或许就是你自己!)在以后更容易理解它,那就非常值得这样做。但是,要注意书写正确的注释,并且在你修改带代码时要注意注释的跟新。注释如果不正确那还不如没有。
  4. 当数组名作为实参时,传递给函数的实际上是一个指向数组起始位置的指针,也就是数组在内存中的地址。正因为实际上传递的是一个指针而不是一份数组的拷贝,才使数组名作为参数时具备了地址调用的语义。函数可以按照操纵指针的方式来操纵实参,也可以像使用数组名一样用下标来引用数组的元素。
  5. 不良的编程风格和不良的文档是软件生产和维护代价高昂的两个重要原因。
  6. 如果下标是从那些已知是正确的值计算得来的,那么就无需检查它的值。如果一个用作下标的值是根据某种方法从用户输入的数据产生而来的,那么在使用之前必须进行检查,确保他们位于有效的范围之内。
  7. 当你声明变量时,如果变量的值不会被修改,你应当在声明中使用const关键字。这种做法不仅使你的意图在其他读你的程序的人面前得到更清晰的展现,而且当这个值被意外修改时,编译器能够发现这个问题。
  8. 在头文件中编写并通过#include指令包含到其他文件中的声明就好像他们是直接写在那些文件中一样。他们的作用域并不局限于头文件的文件尾。
  9. C并不具有任何输入输出语句;I/O是通过调用调用库函数实现的。C也不具备任何异常处理语句,他们也是通过库函数来实现的。
  10. 在一个没有循环体的循环中,用一个分号表示空语句,并让它独占一行。
  11. for循环的可读性比while循环强,因为它把用于循环的表达式收集起来放在一个地方。
  12. 在每个swicth语句中使用default子句。
  13. 判断表达式的长度并不需要对表达式进行求值,所以sizeof(a = b + 1)并没有向a赋值。
  14. 尽管关系操作所实现的功能和你预想的一样,但他们实现功能的方式则和你预想的稍有不同。这些操作符产生的结果都是一个整型值,而不是布尔值。如果两端的操作数符合操作符制定的关系,表达式的结果是1,如果不符合,表达式的结果是0。
  15. 名字与内存位置之间的关联并不是硬件所提供的,它是由编译器为我们实现的。所有这些变量给了我们一种更方便的方法记住地址--硬件仍然通过地址访问内存位置。
  16. 变量包含了一序列内容为0或者1的位。他们可以被解释成整数,也可以被解释成浮点数,这取决于他们被使用的方式。如果使用的是整型算数指令,这个值就被解释成整数,如果使用的是浮点型指令,它就是浮点数。
  17. 不能简单的通过检查一个值的位来判断它的类型。为了判断值的类型,你必须观察程序中这个值的使用方式。
  18. 无论是程序员还是计算机都无法通过值的位模式来判断它的类型。
  19. 声明一个指针变量并不会自动分配任何内存。在对指针执行间接访问前,指针必须进行初始化,或者使它指向现有的内存,或者给它分配动态内存。
  20. 所有的函数都应该具有原型,尤其是那些返回值不是整型的函数,记住,值的类型并不是值的内在本质,而是取决于它被使用的方式,如果编译器认定函数返回一个整型值,它将产生整数指令操纵这个值,如果这个值实际上是个非整型值,比如说是个浮点值,其结果通常是不正确的。
  21. 下标引用实际上是间接访问的另一种形式,它可以对指针执行间接访问操作,访问指针指向的内存位置。
  22. 作为函数参数的多维数组名的传递方式和一维数组名相同----实际传递的是个指向数组第1个元素的指针。但是,两者之间的区别在于,多维数组的每个元素本身是另外一个数组,编译器需要知道它的维数,以便为函数形参的下标表达式进行求值。
  23. 在多维数组中,只有第1维才能根据初始化列表缺省地提供。剩余的几个维必须显式地提供,这样编译器就能推断出每个子数组维数的长度。
  24. 字符串就是零个或多个字符的序列,该序列以一个NUL字节结尾。字符串长度就是它所包含的字符的数目。
  25. 不要试图自己编写功能相同的函数来取代库函数。
  26. 任何使用位段实现的任务都可以使用位移和屏蔽来实现。位段提供的唯一优点是简化了源代码,这个优点必须与位段的移植性较弱这个缺点进行权衡。
  27. 一个联合的所有成员都存储于同一个内存位置。通过访问不同类型的联合成员,内存中相同的位组合可以被解释为不同的东西。联合在实现记录时很有用,但程序员必须负责确认实际存储的是哪个变体并选择正确的联合以便访问数据。
  28. 把结构标签声明和结构的typedef声明放在头文件中,当源文件需要这些声明时可以通过#include指令把他们包含进来。
  29. 如果一个指针不是从早先的malloc,calloc或realloc函数返回的,它是不能作为参数传递给free函数的。你也不能只释放一块内存的一部分。
  30. 内存泄漏是指内存被动态分配之后,当它不再使用时未被释放。内存泄漏会增加程序的体积,有可能导致程序或系统的崩溃。
  31. 简单的声明一个函数指针并不意味着它马上就可以使用。和其他指针一样,对函数指针执行简介访问之前必须把它初始化为指向某个函数。
  32. 函数名被使用时总是由编译器把它转换为函数指针。
原创粉丝点击