谈谈实际编程中遇到最多的问题

zhenghongchao 2012-05-30 12:03:01
工作几年了,算不上码农,总是在解bug,谈谈经常遇到的问题
1) 数据类型混用。 这个问题由来已久,大家可能都知道,但是实际工作中不注意,经常转换出错,最多的是int 被转换成unsigned int或者unsigned 变换成int, 造成的错误很难检查出来,编译时最多是个警告,很多编译器警告也没有。最基本的东西往往需要牢记,并且多看看些历史的失败经验教训,那样才会有深刻的体会!
2)返回值检查不充分。 返回值有很多种可能,很少人会每个都处理,基本就是两个:成功或者不成功,甚至很多时候连返回值都不判断,直接调用,理所当然认为不会失败,结果问题会很绕,往往出错的地方离触发点很远,调试很辛苦啊!另外C++中还有个讨厌的异常处理,很多人不关心,有些则因为编译器的问题对异常类(模板)的继承与重载处理不好,出了问题都让人抓狂。
3)边界条件处理不当。 这个最难处理,因为很多时候设计者为了简单,往往不会考虑太多,程序运行的结果像是飞船进入了异度时空,而且很多时候往往很久才能发现,最重要问题还不是这个,相比较前两个这个最难的是修改,因为原来设计者都没有考虑,你必须完全理解原始设计者的思想才能比较好地解决。最简单的例子就是 for循环(i=0; i <=100; i++)中的 i < 100 还是 i <= 100, 如果没有注释鬼才知道他要100次还是101次呢。
基本上通用的就三点,另外我做嵌入式,有些特殊的方面要特别注意
1)效率,嵌入式程序的CPU占用率不能太高,否则系统随时崩溃,所以在大数据量的循环嵌套,查找替换等等需要好的算法,另外很多时候一个简单的语句如果被重复调用很多次,那么这个简单语句就不能简简单单的了!很多时候需要实际测试来决定。
2)内存,能少用就少用,很多时候内存耗费在你根本想不到的地方,有时开个大块内存(4k)就失败,所以内存泄漏是非常严重的问题,毕竟嵌入式系统的内存太少了。。。另外栈的使用也要注意,很多函数形参最好能用引用就用引用,不能用引用用指针,否则堆栈很快满了,运行效率大大地低啊!
...全文
275 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
赵4老师 2012-06-05
  • 打赏
  • 举报
回复
防御式编程。
可能发生错误的地方一定会发生错误。
赵4老师 2012-06-05
  • 打赏
  • 举报
回复
很多本来该写“<=”或“>=”的地方错误地写成“==”了。
hondely 2012-06-05
  • 打赏
  • 举报
回复
nice_cxf 2012-06-05
  • 打赏
  • 举报
回复
3其实也简单,循环一律用<(迭代器用!=)而不用<=,后边如果是常量尽量用宏定义
cbzjzsb123 2012-06-05
  • 打赏
  • 举报
回复
zhenghongchao 2012-06-05
  • 打赏
  • 举报
回复
受教了!

[Quote=引用 6 楼 的回复:]

不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
if (条件1) break;
//...
if (条件2) continue;
//...
if (条件3) return;
//...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语……
[/Quote]
qq120848369 2012-05-30
  • 打赏
  • 举报
回复
嵌入式啊, 两码事, 围观.
ma100 2012-05-30
  • 打赏
  • 举报
回复
lz用的什么嵌入式平台啊, 4k就失败, 那就即早别用c++了
赵4老师 2012-05-30
  • 打赏
  • 举报
回复
不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
if (条件1) break;
//...
if (条件2) continue;
//...
if (条件3) return;
//...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语义都是当文件未结束时读字符
whlie (!feof(f)) {
a=fgetc(f);
//...
b=fgetc(f);//可能此时已经feof了!
//...
}
而这样写就没有问题:
whlie (1) {
a=fgetc(f);
if (feof(f)) break;
//...
b=fgetc(f);
if (feof(f)) break;
//...
}
类似的例子还可以举很多。

不要把
fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待

fopen("...","...b");fread,fwrite,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了
赵4老师 2012-05-30
  • 打赏
  • 举报
回复
“多一少一”问题占程序员常犯错误的10%以上!

printf里面的%和变量的一一对应关系
scanf里面的%和变量以及变量前加不加&的一一对应关系
是C代码中非常容易出错的地方。
所以在编译源代码之前值得专门仔细检查一遍甚至多遍。
星星x 2012-05-30
  • 打赏
  • 举报
回复
楼上 +1
cyclejdm 2012-05-30
  • 打赏
  • 举报
回复
第一个问题很好处理 把所有警告都当作错误来处理 这是个好习惯

64,641

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧