写程序老是调bug调半天,是时候总结一下了!
总体分析
对于程序总体逻辑没有很好的把握
使用了自己一知半解的内容
对细节没有把握好
编译器存在差距
具体内容
逻辑方面
先后顺序错误,比如要赋值给别的变量的变量已经被其他值改变了。
数学公式推理不正确或不全面。
如插入排序中变量赋值顺序(比如应该用for(int i = vec.size() - 1; i >= 0; i–)而非习惯性的for(int i = 0; i != vec.size(); i++))错误,导致把空值赋给有效值,如是重复。
变量方面
对于 unsigned 型做减法,减到比0还小,这时 unsigned 值会变到很大很大(用我的话说是翻上去一轮 / 否极泰来 / 一失足成千古恨)。
Best Practice:
尽量不要对 unsigned 值做减法。比如在第一象限的坐标肯定是x,y>0,但是再做向下移动到x轴上,如果这么写if (y - 1 >= 0) { /* do something */ },这个判断就起不到作用了。
左值可写性要考虑清楚,尤其涉及到 const 的时候。
Best Practice:
了解清楚各种情况的 const,详见我的博客 关于 C++中 Top-level Const 和 Low-level Const 的思考。
和已有变量或已有函数重名。
关于指针和引用的书写和应用。
Best Practice:
分清指针的几种状态:p是指针,*p是所指的值。
一般来说能用引用的建议用引用,这样简介很多,例如:我的博客 关于 C++中 swap函数的三种方法的思考。
函数内修改变量的值只对全局变量有效。
Best Practice:
改变 parameter list(参数列表) 中的值应用引用类型。
未初始变量。
Best Practice:
Always initialize a variable!
定义类的时候注意 private 和 public 的设定。
运算方面
除法可能是整数除法。
Best Practice:
本身是 double 型的数直接定义 double 型,否则用 static_cast。
特别注意:就算接受结果的数是 double 型的也可能做整数除法。程序其实是将整除结果再转化为 double 后存入 double 变量中去的。
注意运算优先级。
Best Practice:
例如p.begin() + 1并不是第二个值,而是第一个值加一。正确写法为:(p.begin() + 1) 。
当不能确定运算顺序时,可以使用括号。
数组或者 vector 超过下标(subscript out of range),这是极其常见的错误类型。
Best Practice:
使用时仔细判断一下再写。
switch 未加 break。(特殊情况除外,且此时要写注释)
书写方面
打了中文分号等错误符号。 单词拼写错误。 笔误,输入了不是此处要的变量。
Best Practice:
这种错误尤其发生在拷贝内容的时候,拷贝过来之后,记得好好检查是否要做更多的变化。
是 == 不是 = 的时候分清
漏了分号或者括号、大括号
判断大小不能用a < x < b。
Best Practice:
记住比较运算符得出的结果是0或者1。
其他方面
先声明,后使用。
Best Practice:
声明可以多次,定义只能一次
编译器不支持功能。
Best Practice:
尽量选用新版的编译器,最好是Visual Studio
避免使用C语言风格,这是很多报错的原因。
一个解决方案中出现好几个主程序
Best Practice:
每一个新的程序新建一个解决方案。
指导建议
培养逻辑感
多学多用,注重细节
使用好F10和F11的调试功能
(持续更新中)
ALL RIGHTS RESERVED © 2020 Teddy van Jerry
欢迎转载,转载请注明出处。
See also