C语言程序纠错_第1页
C语言程序纠错_第2页
C语言程序纠错_第3页
C语言程序纠错_第4页
C语言程序纠错_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、程序改错程序改错学习如钻探石油,钻得愈深,愈能找到知识的精髓学习如钻探石油,钻得愈深,愈能找到知识的精髓程序改错程序改错是个大悲大喜的环节是个大悲大喜的环节, ,一天之内能够让人在悲戚的低谷和一天之内能够让人在悲戚的低谷和喜悦的巅峰之间跌宕起趴喜悦的巅峰之间跌宕起趴. .似果改过了成千上万个错误似果改过了成千上万个错误, ,改错非常像侦破案件改错非常像侦破案件, ,有坏事产生了有坏事产生了, ,而仅有的信息是它的而仅有的信息是它的确产生了确产生了. .必须从结论出发必须从结论出发, ,逆向摸索逆向摸索学习如钻探石油,钻得愈深,愈能找到知识的精髓学习如钻探石油,钻得愈深,愈能找到知识的精髓程序改

2、错程序改错改错的第一步是寻犯错误的根源改错的第一步是寻犯错误的根源,接着对症下药接着对症下药寻觅错误根源的环节称为调试寻觅错误根源的环节称为调试.学习如钻探石油,钻得愈深,愈能找到知识的精髓学习如钻探石油,钻得愈深,愈能找到知识的精髓程序改错程序改错难点在于难点在于: :症状和根源大概相隔非常远症状和根源大概相隔非常远有人咨询阿凡提有人咨询阿凡提:“:“我肚子疼我肚子疼, ,该用啥药?该用啥药?”症状大概在另一个错误被改正后临时消散症状大概在另一个错误被改正后临时消散症状同时不是某个程序错误引发的症状同时不是某个程序错误引发的, ,似误差累积似误差累积症状大概时隐时现症状大概时隐时现, ,似似

3、“内存泄露内存泄露”非常难产生完全一样的输入前提非常难产生完全一样的输入前提, ,难以恢复难以恢复“错误的现场错误的现场”学习如钻探石油,钻得愈深,愈能找到知识的精髓学习如钻探石油,钻得愈深,愈能找到知识的精髓程序中常见的犯错缘由程序中常见的犯错缘由编译错误编译错误指在编译环节中发觉的错误指在编译环节中发觉的错误,往往属于语法错误往往属于语法错误,即编写的语句不吻合即编写的语句不吻合C语言的语法法那么语言的语法法那么.Undefined symbol xxx 标识符标识符xxx未定义未定义Expression syntax error 表达式语法错误表达式语法错误Too few paramet

4、er in call 函数调用时的实参函数调用时的实参少于函数的形参少于函数的形参学习如钻探石油,钻得愈深,愈能找到知识的精髓学习如钻探石油,钻得愈深,愈能找到知识的精髓程序中常见的犯错缘由程序中常见的犯错缘由运行错误运行错误指在程序运行时产生的错误指在程序运行时产生的错误往往是因为语义上的错误造成的往往是因为语义上的错误造成的,即语句固然合即语句固然合乎语法乎语法,但要求统计机去做不该做或做不到的情但要求统计机去做不该做或做不到的情况况.例似当用例似当用0做除数时做除数时,运行后将表现运行后将表现“Division by zero”错误提示信息错误提示信息,同时站即返回编纂屏幕同时站即返回编

5、纂屏幕.查看运行结论时查看运行结论时,可在可在User screen(用户屏幕)(用户屏幕)上看到给出的错误提示信息上看到给出的错误提示信息. 学习如钻探石油,钻得愈深,愈能找到知识的精髓学习如钻探石油,钻得愈深,愈能找到知识的精髓逻辑错误逻辑错误程序中有逻辑错时程序中有逻辑错时, ,不作用程序运行同时猎取不作用程序运行同时猎取运行结论运行结论, ,只是运行结论不精确只是运行结论不精确. .对比躲藏对比躲藏, ,犯犯错后不易查寻错后不易查寻. .累加求和运算时累加求和运算时, ,累加和变量不记得了赋初值;累加和变量不记得了赋初值;累乘运算时累乘运算时, ,累乘变量初值赋值为累乘变量初值赋值为0

6、 0;函数表明时的返回值信息类型与现实返回的信函数表明时的返回值信息类型与现实返回的信息类型不一致息类型不一致, ,导致自动类型变形导致自动类型变形数组下标越界(即超出了定义的范畴);数组下标越界(即超出了定义的范畴);程序中存在死循环;程序中存在死循环; 程序中常见的犯错缘由程序中常见的犯错缘由学习如钻探石油,钻得愈深,愈能找到知识的精髓学习如钻探石油,钻得愈深,愈能找到知识的精髓程序改错程序改错在程序设计语言的进展中在程序设计语言的进展中, ,一个重要的勉力方向便是想一个重要的勉力方向便是想通过语言特点的设计扶助幸免错误通过语言特点的设计扶助幸免错误似下标范畴查抄似下标范畴查抄, ,受限制

7、的指针甚到完全勾销指针受限制的指针甚到完全勾销指针, ,内内存回收存回收, ,强类型查抄强类型查抄但没有任何语言能防备我们犯错误但没有任何语言能防备我们犯错误, ,每个为防备某些咨每个为防备某些咨询题而设置的语言特点都会带给它自身额外的代价询题而设置的语言特点都会带给它自身额外的代价做为程序员应明白所用语言中有潜在危险和引起错误做为程序员应明白所用语言中有潜在危险和引起错误倾向的那些语言特点倾向的那些语言特点似似gotogoto语句语句, ,全局变量全局变量, ,无限制的指针无限制的指针, ,自动类型变形自动类型变形天下上最好的调试工具是那些有履历的人天下上最好的调试工具是那些有履历的人学习如

8、钻探石油,钻得愈深,愈能找到知识的精髓学习如钻探石油,钻得愈深,愈能找到知识的精髓调试的根基方式调试的根基方式“粗分细寻粗分细寻”定位大抵的范畴定位大抵的范畴: :回纳、推理、二分、排解回纳、推理、二分、排解缩减输入信息缩减输入信息设法寻到能导致失败的最小输入设法寻到能导致失败的最小输入 采纳注释的方式切掉部分代码采纳注释的方式切掉部分代码削减有关的代码区域削减有关的代码区域, ,调试无误后再将它们打开注释调试无误后再将它们打开注释, ,即采纳分而治之的法那么将咨询题局部化即采纳分而治之的法那么将咨询题局部化 操纵调试工具操纵调试工具追条语句跟踪追条语句跟踪插入打印语句插入打印语句观看屏幕输出

9、结论观看屏幕输出结论学习如钻探石油,钻得愈深,愈能找到知识的精髓学习如钻探石油,钻得愈深,愈能找到知识的精髓错误案例错误案例关系运算符关系运算符= 错写成错写成 赋值运算符赋值运算符=if (a = b) printf(yes); *运行结论错误运行结论错误*Warning:Possibly incorrect assignment in function mainif (a = b) printf(yes); *精确精确*= 示意赋值操纵示意赋值操纵= 示意对比是否相等的操纵示意对比是否相等的操纵学习如钻探石油,钻得愈深,愈能找到知识的精髓学习如钻探石油,钻得愈深,愈能找到知识的精髓错误案例

10、错误案例while背面有分号背面有分号while (n 100); n+;循环体为空语句循环体为空语句,导致死循环导致死循环for后的表达式后的表达式2省略省略for (n=1; ;n+) *死循环死循环*学习如钻探石油,钻得愈深,愈能找到知识的精髓学习如钻探石油,钻得愈深,愈能找到知识的精髓错误案例错误案例推断字符是大写字符大概小写字符推断字符是大写字符大概小写字符(a = ch = z) | (A = ch =a&ch=A&ch=Z) *精确精确*推断字符是数字字符推断字符是数字字符0 = ch = 0 & ch = 9 *精确精确*学习如钻探石油,钻得愈深,愈能找到知识的精髓学习如钻探石

11、油,钻得愈深,愈能找到知识的精髓错误案例错误案例信息类型由高向低赋值时信息类型由高向低赋值时,履行类型变形后导致信息丢失履行类型变形后导致信息丢失double a, b;int sum;sum = a + b;TC下编译下编译,不提示任何错误不提示任何错误VC下编译下编译warning C4244: = : conversion from double to int , possible loss of data学习如钻探石油,钻得愈深,愈能找到知识的精髓学习如钻探石油,钻得愈深,愈能找到知识的精髓错误案例错误案例函数表明时的返回值类型与现实返回的信息类型不一致函数表明时的返回值类型与现实返回

12、的信息类型不一致,导致导致自动类型变形自动类型变形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 , possible loss of data学习如钻探石油,钻得愈深,愈能找到知识的精髓学习如钻探石油,钻得愈深,愈能找到知识的精髓错误案例错误案例#include stdio.h#include mat

13、h.hint main() int a=4,b=8,c; c=sqrt(a); printf(%d %dn,c,b); printf(%d %dn,(int)sqrt(a),b); printf(%f %dn,sqrt(a),b); printf(%d %dn,sqrt(a),b); return 0;学习如钻探石油,钻得愈深,愈能找到知识的精髓学习如钻探石油,钻得愈深,愈能找到知识的精髓错误案例错误案例数组下标越界数组下标越界int a10,i,sum;for (i=1; i=10; i+)sum = sum + ai;不提示任何错误不提示任何错误,大概提示大概提示Written、read之

14、类信息之类信息学习如钻探石油,钻得愈深,愈能找到知识的精髓学习如钻探石油,钻得愈深,愈能找到知识的精髓对于代码风格咨询题对于代码风格咨询题缩进缩进(indent)(indent)保证代码整洁、层次清楚的关键手段保证代码整洁、层次清楚的关键手段int isprime(int n)int k,i;k=sqrt(double)n); for (i=2;i=k;i+)if(n%i=0) return 0;return 1;#includeint main()int i;for (i=2;i100;i+)if(isprime(i)printf(%dt,i); return 0;学习如钻探石油,钻得愈深,

15、愈能找到知识的精髓学习如钻探石油,钻得愈深,愈能找到知识的精髓对于代码风格咨询题对于代码风格咨询题良好风格的程序应严格采纳梯形层次对应好各层次良好风格的程序应严格采纳梯形层次对应好各层次int isprime(int n) int k, i; k = sqrt(double)n); for (i=2; i=k; i+) if (n % i = 0) return 0; return 1;#include int main() int i; for (i=2; i100; i+) if (isprime(i) printf(%dt,i); return 0;学习如钻探石油,钻得愈深,愈能找到知识的精髓学习如钻探石油,钻得愈深,愈能找到知识的精髓程序版式程序版式此刻的很多开发环境、编纂软件都撑持此刻的很多开发环

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论