C语言程序纠错.pptVIP

  1. 1、本文档共20页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
程序改错 程序改错 是个大悲大喜的过程,一天之内可以让人在悲伤的低谷和喜悦的巅峰之间跌宕起伏。 如果改过了成千上万个错误,…… 改错很像侦破案件,有坏事发生了,而仅有的信息是它的确发生了。 必须从结果出发,逆向思考 程序改错 改错的第一步是找出错误的根源,然后对症下药 寻找错误根源的过程称为调试。 程序改错 难点在于: 症状和根源可能相隔很远 有人问阿凡提:“我肚子疼,该用什么药?” 症状可能在另一个错误被纠正后暂时消失 症状并不是某个程序错误引发的,如误差累积 症状可能时隐时现,如“内存泄露” 很难产生完全一样的输入条件,难以恢复“错误的现场” 程序中常见的出错原因 编译错误 指在编译过程中发现的错误,通常属于语法错误,即编写的语句不符合C语言的语法规则。 Undefined symbol xxx 标识符xxx未定义 Expression syntax error 表达式语法错误 Too few parameter in call 函数调用时的实参少于函数的形参 程序中常见的出错原因 运行错误 指在程序运行时发生的错误 往往是由于语义上的错误造成的,即语句虽然合乎语法,但要求计算机去做不该做或做不到的事情。 例如当用0做除数时,运行后将显示“Division by zero”错误提示信息,并立即返回编辑屏幕。查看运行结果时,可在User screen(用户屏幕)上看到给出的错误提示信息。 程序中常见的出错原因 逻辑错误 程序中有逻辑错时,不影响程序运行并得到运行结果,只是运行结果不正确。比较隐蔽,出错后不易查找。 累加求和运算时,累加和变量忘记了赋初值; 累乘运算时,累乘变量初值赋值为0; 函数声明时的返回值数据类型与实际返回的数据类型不一致,导致自动类型转换 数组下标越界(即超出了定义的范围); 程序中存在死循环; 程序改错 在程序设计语言的发展中,一个重要的努力方向就是想通过语言特征的设计帮助避免错误 如下标范围检查,受限制的指针甚至完全取消指针,内存回收,强类型检查 但没有任何语言能防止我们犯错误,每个为预防某些问题而设置的语言特征都会带给它自身额外的代价 作为程序员应知道所用语言中有潜在危险和引起错误倾向的那些语言特征 如goto语句,全局变量,无限制的指针,自动类型转换 世界上最好的调试工具是那些有经验的人 调试的基本方法 “粗分细找” 定位大致的范围:归纳、推理、二分、排除 缩减输入数据 设法找到能导致失败的最小输入 采用注释的办法切掉一些代码 减少有关的代码区域,调试无误后再将它们打开注释,即采用分而治之的策略将问题局部化 利用调试工具 逐条语句跟踪 插入打印语句 观看屏幕输出结果 错误案例 关系运算符== 错写成 赋值运算符= if (a = b) printf(yes); /*运行结果错误*/ Warning:Possibly incorrect assignment in function main if (a == b) printf(yes); /*正确*/ = 表示赋值操作 == 表示比较是否相等的操作 错误案例 while后面有分号 while (n 100); { …… n++; } 循环体为空语句,导致死循环 for后的表达式2省略 for (n=1; ;n++) /*死循环*/ 错误案例 判断字符是大写字符或者小写字符 (a = ch = z) || (A = ch = Z) /*不提示任何错误,但导致运行结果错误*/ (ch=ach=z) || (ch=Ach=Z) /*正确*/ 判断字符是数字字符 0 = ch = 9 /*不提示任何错误,但导致运行结果错误*/ ch = 0 ch = 9 /*正确*/ 错误案例 数据类型由高向低赋值时,进行类型转换后导致信息丢失 double a, b; int sum; sum = a + b; TC下编译,不提示任何错误 VC下编译 warning C4244: = : conversion from double to int , possible loss of data 错误案例 函数声明时的返回值类型与实际返回的数据类型不一致,导致自动类型转换 double Add(double a, double b) { int sum; …… return sum; } 不提示任何错误 int Add(double a, double b) { double sum; …… return sum; } warning C4244: return : conversion from double to int , pos

文档评论(0)

jdy261842 + 关注
实名认证
文档贡献者

分享好文档!

1亿VIP精品文档

相关文档