c++bug转载

写程序老是调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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值