- 1、本文档共13页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
常见错误分析.doc.doc
一、诊断错误及其处理
防止程序出错的第一关是编译器。如果遇到约束违规的情况或语法错误,编译器至少会生成一个诊断错误信息。大多数编译器将其诊断信息分为两类:错误和警告。语法错误很常见,也较易修改。调试程序时首先要改正的是语法错误,调试本身是一种艺术,是程序中断时试着去修复的一种艺术。
糟糕的语法会使编译器混乱,甚至可能达到生成很多错误的程度,程序设计者对这种情况不要大惊小怪,应冷静对待,其实很可能仅仅是由于某一个语句引起的,比如说漏掉了while循环中的一个大括号或语句末尾键入了冒号而非分号等。为此我们应该养成一种习惯,自顶向下的修改方法,每次从错误表的开头开始,一次修改一、二个错误再编译,或许错误就能减少许多甚至全部语法错误。
模块化程序设计也有助于程序的排错。调试一个充满连接和转折、全局变量等的程序要比调试一个精心设计的模块化程序困难得多。如果程序分成几个模块,各个模块负责程序的一个专项功能,一旦识别出问题可能所处的模块,就很容易地通过检查源代码方式来发现错误,这种策略也称为分治法,因为如果知道了没有问题之处,几乎等同于知道了问题发生的地方。
有时我们也可以忽略警告,但这并非是一种良好的编程习惯,追踪每个警告的原因并认真考虑是否有更稳健的方法编写代码能够帮助编程者编写更好的代码。如果我们只是忽略它,当这些“无害”的警告不断累积到一定程度时,可能面临出现混乱的危险。
二、差1错误及其处理
在C语言中,一个拥有n个元素的数组,不存在下标为n的元素,其元素下标的允许取值范围为0到n-1。请考察下列一段代码:
int a[10],i; for(i=1; i=10; i++) a[i]=0;
这段代码本意是要设置数组a中的10个元素均为0,却产生了一个出人意料的“副作用”。循环把并不存在的a[10]元素设置为0。如果用来编译这段程序的编译器按照内存地址递减的方式来给变量分配内存,则内存中数组a之后的2个字节实际上分配给了整型变量i。此时,本来循环计数器i的值为10,循环体内将并不存在的a[10]设置为0,实际上却是将计数器i的值设置为0,这就陷入了死循环。
这是程序设??中较常见也较难觉察的一类错误,被称为“差一错误”(off-by-one error)。“差一错误”也称“栏杆错误”,问题说的是:100英尺长的围栏每隔10英尺需要一根支撑用的栏杆,一共需要多少根呢?如果不假思索,将100除以10得到10,当然这个答案是错误的,正确的答案应该是11。是否存在一些编程技巧,能够降低这类错误发生的可能性呢?“不对称边界”法给程序设计带来的便利非常明显。在“不对称边界”法中,可以规定数组元素的第一个“入界点”(对C语言而言,0就是数组下标的第一个“入界点”)和第一个“出界点”(对上述定义的数组而言,第一个出界点就是10,它不在数组下标范围之内)。在这种方法下,“出界点”的值即是数组的长度。
三、“悬挂”else错误及其处理
这个问题并非C语言所独有,也已经为人熟知,但即使是有经验的C程序员,也常常在此失误。如果想实现当x 分别是大于0、等于0和小于0时y值分别取得1、0和-1。考虑下面的程序片段:
y=0;
if(x=0)
if(x0) y=1;
else y=-1;
然而,这段代码实际上所做的与编程者的愿望相去甚远。原因在于C语言中有这样的规则,else总是与同一对括号内最近的未匹配的if结合。如果我们按照上面这段程序实际上被执行的逻辑来调整代码缩进,大致是这样:
y=0;
if(x=0)
if(x0) y=1;
else y=-1;
也就是说,并非是当x0时y=-1,而是当x=0时也使y=-1。
解决这一问题我们可以用“封装”的办法,将上述程序改为:
y=0;
if(x=0)
{if(x0) y=1;}
else y=-1;
现在,else与第一个if结合,即使它离第二个if更近也是如此,因为此时第二个if已经被括号“封闭”起来了。
四、整数溢出及其处理
C语言为编程者提供了三种不同长度的整数:short int、int和long int,但不管是哪种类型表示的整数总有一定的范围,越出该范围时称为整数的溢出。例如现有算法要求如下:求满足条件1+2+3+…+n≤32767的最大整数n,请考察如下程序段:
int n=1,sum=0;
while(sum=32767) {sum+=n; n++;}
printf(“n=%d\n”,n-1);
乍看该程序时无错误,但事实上,上列程序中的while循环是一个无限循环,原因在于int型数的表示范围为-32768到+32767,当累加和sum超过32767时,便向高位进位,而对int型数而言,最高位表示符号,故sum超过32767后便得到一个负数,while条件当然满足,从而形成无限循
您可能关注的文档
- 基于ARM的光伏电站数据监测系统设计-电测与仪表.doc
- 基于CFD的气动弹性时域仿真软件-南通市科技创新服务平台.doc
- 基于ClosePagePolicy的SDRAM控制器设计原理-SOC@Fudan-复旦.doc
- 基于DeviceNet现场总线的组态软件SEARI-上海电器科学研究所.doc
- 基于DSP的PDIUSBD12芯片的应用开发.doc
- 基于ICM的李白诗连贯分析.ppt
- 基于Internet的专家系统在环境保护中的应用-易网首页.doc
- 基于IP地址的气象查询服务WSA.ppt
- 基于IXP465的智能变电站通信单元设计.doc.doc
- 基于java3D的模型动作引擎-Read.doc
最近下载
- 八年级英语下册阅读理解测试题(A)﹙含答案﹚1.pdf VIP
- Unit 3 The world meets china Writing 教学设计-2023-2024学年高中英语外研版(2019)选择性必修第四册.docx VIP
- 北师大数学二年级下册第五单元《加与减》单元整体教学设计.pdf
- 2025人教高中物理同步讲义练习选择性必修二专题提升Ⅸ 电磁感应中的能量和动量问题(含答案).docx
- 2025至2030年北京市智能制造业发展与标杆城市政策对比研究专项报告.docx
- 人教版 七年级英语下册 第二学期 期末综合测试卷(2025年春)(三).pdf VIP
- 收费站绿通业务服务培训.pptx
- 心电一张网:2立项-新技术、新项目临床应用申请表.doc
- 丰田初期流动管理计划书.xls VIP
- 计算机网络安全试题及答案-练习题-题库带答案.pdf VIP
文档评论(0)