编程中经常出现的问题

1. int/int得到的类型也是int型的,如果结果需要小数的形式,一定要显式的转换为float或double

2. 读文件时,经常用fseek(fp,0,SEEK_END)将文件指针指到结尾,用来计算文件的大小。然后再读文件时,需要先用SEEK_SET把文件指针指回来,不然读不到数据。

3. 当一个char*参数传入函数中是,一定要先对字符串是否为空做判断。

 if(!str || *str==0)
 {
  return false;
 }

我不清楚为什么要用*str==0来判断字符串是否为空。感觉另外一种方式似乎更合适一些:

if( str ==  NULL || strlen(str)  == 0 )

4.一个string类型的参数传入的时候,也要对字符串做是否为空的判断

if (str == null || str == "")

  return;

5. 当为一个指针参数分配内存的时候,参数要用指向指针的指针,即**。如果只是传递一个指针,分配的空间在函数返回后被收回。

6. 结构体的指针+1,相当于加了结构体的大小。其实对于所有类型都是如此。

7. 变量尽量使用局部变量,否则会带来不必要的麻烦。变量要赋初值,循环中要反复赋初值,不然变量很容易出错。

8. 结构体的初始化:  static   OPENFILENAME   ofn={0};  

结构体实际上就是一段连续的内存空间,排列着各个结构成员,有数据有指针。你可以看着是一维的一个序列。   
ofn={0};自然就是初始化所有成员的了。

9. 全局变量或静态变量都存放在程序专有的全局变量区,程序结束才释放,如果未初始化化,系统默认初始化为0;局部变量或形参都是动态存储在一个栈里面的,执行完某函数时这些变量就释放,如果未初始化,变量值是不确定的。

10. 用new分配的存储空间是未初始化的,它包含随机的位模式。delete释放指针指向的存储空间,指针仍然存在,这时最好把指针赋值为0. 用new创建的内置类型的数组,必须用for循环初始化,即一个一个的初始化。char*的可以不用,把字符串读入即可。

11. 代码中用到了set<char*>,实际证明这是种错误的应用。插入时,比较的是字符串的首地址,虽然两个字符串的内容相同,但它们的地址是不同的,所以set视它们为不同的元素。  在stl的应用中,尽量避免指针类型的数据,使用string代替char。

12. 枚举enum中的变量默认是int型的,第一个元素默认为0,之后递增。ENUM相当于定义一种类型,这种类型包含几种可能值,这种类型的变量只能赋值为它规定好的几个值。

13. 基类的private成员变量,其实是可以被public继承的,但是继承后子类不能访问基类的private变量,只能用基类的成员函数访问基类的成员变量。这一点以前没有理解好,原来以为private是不能被继承的。实际上可以继承,但是不能使用。

14. 对于内部数据类型的输入参数,不要将“值传递”的方式改为“const &”。对于非内部数据类型(类类型),将“值传递”的方式改为“const &”,可以有效提高效率。

15.  并发错误一定是由于函数中有对成员变量或者全局变量的写操作引起的。所以server上调用的函数,对成员变量和全局变量不能有写操作。

16. 编译时遇到error,说在代码前边缺少";"。发现原因是包含的某个头文件最后少写了个";"。以前还没遇到过这种问题。

17. 血的教训

     try catch是不能捕获数组越界错误的,如果数组越界访问会导致程序崩溃。try catch不是万能的,不能什么都指望它,还是要有更严格的逻辑判断。

你可能感兴趣的:(编程,String,null,delete,存储,float)