欢迎来到天天文库
浏览记录
ID:39384544
大小:330.32 KB
页数:27页
时间:2019-07-02
《常见错误类型和程序调试》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、常见错误和程序调试1常见错误分析2程序调试要真正学好C、用好C并不容易,“灵活”固然是好事,但也使人难以掌握,尤其是初学者往往出了错还不知怎么回事。C编译程序对语法的检查不如其他高级语言那样严格(这是为了给程序人员留下“灵活”的余地)。因此,往往要由程序设计者自己设法保证程序的正确性。需要不断积累经验,提高程序设计和调试程序的水平。13.1常见错误分析下面将初学者在学习和使用C语言(不包括C++)时容易犯的错误列举出来,以起提醒的作用。这些内容在以前各章中大多已谈到,为便于查阅,在本章中集中列举,供初学者参考,
2、以此为鉴。(1)忘记定义变量。如:main(){x=3;y=6;printf("%d",x+y);}(2)输入输出的数据的类型与所用格式说明符不一致。例如,若a已定义为整型,b已定义为实型。a=3;b=4.5;printf("%f%d",a,b);编译时不给出出错信息,但运行结果将与原意不符,输出为0.00000016402(3)未注意int型数据的数值范围。一般微型计算机上使用的C编译系统,对一个整型数据分配两个字节。因此一个整数的范围为-215~215-1,即-32768~32767。常见这样的程序
3、段:intnum;num=89101;printf("%d",num);得到的却是23565,原因是89101已超过32767。两个字节容纳不下89101,则将高位截去。printf("%ld",num);请注意,如果只定义num为long型,而在输出时仍用“%d”说明符,仍会出现以上错误。对于超过整个范围的数,要用long型,即改为longintnum;num=89101;(4)输入变量时忘记使用地址符。如:scanf("%d%d",a,b);C语言要求指明“向哪个地址标识的单元送值”。应写成scanf("%
4、d%d",&a,&b);(5)输入时数据的组织与要求不符。用scanf函数输入数据,应注意如何组织输入数据。在scanf输入时,除了格式控制符以外的其他字符必须按原样输入。假如有以下scanf函数:scanf("%d%d",&a,&b);有人按下面的方法输入数据:3,4应该用以下方法输入:34如果scanf函数为scanf("%d,%d",&a,&b);应按以下方法输入:3,4此时如果用“34”反而错了。(6)误把“=”作为“等于”比较符。在C语言中,“=”是赋值运算符,“==”才是关系运算符“等于”。如
5、果写成if(a=b)printf("aequaltob");C编译系统将(a=b)作为赋值表达式处理,将b的值赋给a,然后判断a的值是否零,若为非零,则作为“真”;若为零作为假。如果a的值为3,b的值为4,a≠b,按原意不应输出“aequaltob”。而现在输出“aequaltob”。这种错误在编译时是检查不出来的,但运行结果往往是错的。而且由于习惯的影响,程序设计者自己往往也不易发觉。(7)语句后面漏分号。C语言规定语句末尾必须有分号。分号是C语句不可缺少的一部分。这也是和其他语言不同的。有的初学者往往忘记写
6、这一分号。如:a=3b=4编译时,编译程序在“a=3”后面未发现分号,就把下一行“b=4”也作为上一行的语句的一部分,这就出现语法错误。如果用复合语句,漏写最后一个语句的分号,如:{t=a;a=b;b=t}(8)在不该加分号的地方加了分号。例如:if(a>b);printf("aislargerthanb");本意为当a>b时输出“aislargerthanb”的信息。但由于在if(a>b)后加了分号,因此if语句到此结束。即当(a>b)为真时,执行一个空语句。本来想a≤b时不输出上述信息,但现在print
7、f函数语句并不从属于if语句,而是与if语句平行的语句。不论a>b还是a≤b,都输出“aislargerthanb”。又如:for(i=0;i<10;i++);{scanf("%d",&x);printf("%d",x*x);}本意为先后输入10个数,每输入一个数后输出它的平方值。由于在for()后加了一个分号,使循环体变成了空语句。只能输入一个整数并输出它的平方值。总之,在if、for、while语句中,不要画蛇添足多加分号。(9)对应该有花括弧的复合语句,忘记加花括弧。如:sum=0;i=1;while
8、(i<=100)sum=sum+i;i++;本意是实现1+2+…+100,即∑i。但上面的语句只是重复了sum+1的操作,而且循环永不终止。因为i的值始终没有改变。错误在于没有写成复合语句形式。因此while语句的范围到其后第一个分号为止。语句“i++;”不属于循环体范围之内。应改100i=0为while(i<=100){sum=sum+i;i++;}(10)括弧不配对。当一个语句中使
此文档下载收益归作者所有