C语言常见错误和程序调试讲义.ppt
文本预览下载声明
程序设计基础 常见错误总结 19、混淆字符和字符串的表示形式。 char sex; sex=M; … sex是字符变量,只能存放一个字符。而字符常量的形式是用单引号括起来的,应改为 sex=M; “M”是用双引号括起来的字符串,它包括两个字符:‘M’和‘\0’,无法存放到字符变量sex中。 20、用自加(++)和自减(--)运算符时出错误。 main( ) {intp,a[5]={1,3,5,7,9}; p=a; printf(%d,*p++); } 不少人认为“*p++”的作用是先使p加1,即指向第1个元素a[1]处,然后输出第一个元素a[1]的值3。其实应该是先执行p++,而p++的作用是先用p的原值,用完后使p加1。p的原值指向数组a的第0个元素a[0],因此*p就是第0个元素a[0]的值1。结论是先输出a[0]的值,然后再使p加1。如果是*(++p),则先使p指向a[1],然后输出a[1]的值。 21、把函数的形参和函数中的局部变量混在一起定义。如: max(x,y) int x,y,z; {z=x>y?x,y; return(z); } 应改为 max(x,y) int x,y; {int z; z=x>y?x:y; return(z); } 22、所调用的函数在调用语句之后才定义,而又在调用前未加说明。 main( ) {float x,y,z; x=3.5;y=-7.6; z=max(x,y); printf(%f\n,z); } float max(float x,float y) {return(z=x>y?x:y);} 这个程序乍看起来没有什么问题,但在编译时有出错信息。原因是max函数是实型的,而且在main函数之后才定义,也就是max函数的定义位置在main函数中的调用max函数之后。改错的方法可以用以下二者之一: ①在main函数中增加一个对max函数的声明,即函数的原型: main( ) {float max(float,float); float x,y,z; x=3.5;y=-7.6; z=max(x,y); printf(%f\n,z); } ② 将max函数的定义位置调到main函数之前。即: float max(float x,float y) {return(z=x>y?x:y);} main() {float x,y,z; x=3.5;y=-7.6; z=max(x,y); printf(%f\n,z); } 23、误认为形参值的改变会影响实参的值。 main( ) {inta,b; a=3;b=4; swap(a,b); printf(%d,%d\n,a,b); } swap(int x,int y) {int t; t=x;x=y;y=t; } 原意是通过调用swap函数使a和b的值对换,然后在main函数中输出已对换了值的a和b。但是这样的程序是达不到目的的,因为x和y的值的变化是不传送回实参a和b的,main函数中的a和b的值并未改变。 如果想从函数得到一个以上的变化了的值,应该用指针变量。用指针变量作函数参数,使指针变量所指向的变量的值发生变化。此时变量的值改变了,主调函数中可以利用这些已改变的值。如: main( ) {int a,b,*p1,*p2; a=3;b=4; p1=a;p2=b; swap(p1,p2); printf(%d,%d\n,a,b); } swap(int *pt1, int *pt2) {int t; t=*pt1;*pt1=*pt2;*pt2=t; } 24、函数的实参和形参类型不一致。 main( ) {int a=3,b=4; c=fun(a,b); … } fun(float x,float y) { … } a和b的值传递给x和y时,x和y的值并非3和4。C要求实参与形参的类型一致。 如果在main函数中对fun作原型声明: fun (float, float); 程序可以正常运行,此时,按不同类型间的赋值的规则处理,在虚实结合后x=3.0, y=4.0。也可以将fun函数的位置调到main函数之前,也可获正确结果。 25、 不同类型的指针混用。 main( ) { int i=3,*p1; float a=1.5,*p2; p1=i;
显示全部