1、scanf(“%s”,&a);有学生想,输入语句的输入变量前一定要加取址符,所以这个语句里加了取址符,肯定不会出错。而结果却又恰恰错了,这是为什么呢?因为a在这里既表示数组名字,又表示数组首地址,它本身已经代表了地址,所以就不用再加取址符了。解决此类问题的办法就是在使用输入语句的时候要仔细观察,什么时候该加取地址符号,什么时候不该加,一定要搞清楚。1.3逻辑运算符&和位运算符&相混淆if(x&y)编辑人员此判别条件的本意是将x和y的“与”(&)运算结果作为条件。程序运行时,并不出错,但是结果却不对。原因是误用按位“与”运算符&替代了“与”运算符&,这种错误初学者很容易犯,但是又十分隐秘,在某些
2、特殊情况下甚至可以得出正确的结果,所以更具有迷惑性。位运算符是C语言独特的一种运算符,其中“&”表示对两个操作数按二进制位进行“与”运算,规则是:0&0=0,0&1=0,1&0=0,1&1=1。如6&5=4,其中6变为00000110,5变为00000101,按位“与”运算的结果为100即4。1.4误把赋值=当恒等=if(a=0)误写成if(a=0)。上述写法将导致条件始终为假,进入不了if语句条件为真的分支。编程的时候要仔细,要遵守c语言的语法规则。1.5条件语句(if)和循环条件语句后误加分号if(xy);x=y;这样相当于满足条件执行空语句。下面的x=y语句将被无条件执行。一般情况下if
3、()条件后不需要加分号。for(i=1;i10;i+);上述for语句相当于满足条件执行空语句,真正的循环语句则没有被执行。一般情况下for()循环条件后不需要加分号。这两个都是初学者容易犯的错误,又很难察觉出来。1.6循环语句中改变了循环变量的值求水仙花数main() int i,a,b,c;for(i=100;1000;i+) a=i%10;i=i/10;b=i%10;c=i%10;/*i的值被改变*/if(a*a*a+b*b*b+c*c*c=i)printf(“%d”,i);此程序看起来思路非常正确,可是高度的时候就是死循环,运行不出结果。为什么呢?仔细观察可知,在循环语句里,循环变量i
4、每次进入循环后都被改变了,导致了i永远都满足循环条件,所以就死循环了。为了避免此类错误,在编程时应尽量避免在循环语句中改变循环变量。1.7作为输出结果的变量没有赋初值求数组中的最大值能最大值的下标 int a10=8,2,3,4,5,6,3,7,max=a10,m,i;for (i=0; imax)max=ai; m=i;printf(“%d%d”,max,m); 程序看似一点毛病都没有,上机调试也都通过,但是结果却不对。原因就在下标变量m没有赋初值,系统随机赋了初值,导致结果错误。给m赋初值0就可以了。1.8初值赋了,但是赋的位置不对求100以内的完数s=0;=100; for(j=1;jb
5、)这一段代码的本意是比较字符串a和字符串b的大小,但是这样比较是不正确的,应该改成 if(strcmp(a,b)0)解决这类问题关键是要记住字符数组名字代表的是字符数组的地址,是常量,不能直接进行复制等操作。这是个容易忽视的地方,也是考试经常出题的地方,希望引起大家的注意。1.13函数调用时参数传递出错void swap(int a,int b) int t;t=a;b=t;此段代码的本意是一个交换两个变量值的函数,但实际上这个函数完不成这个功能,因为本函数传递的是数值,函数调用时传递数值只是对实际参数值的一个拷贝,并不能改变实际参数的值,要完成此功能必须传入地址。因此上例应该为:void s
6、wap(int *a,int *b)t=*a;*a=*b;*b=t;1.14忘记加头文件求1-1/3+1/5-1/7,求此序列的和,直到最后一项的绝对值小于1e-6为止。程序如下: double s=0,x=1;long k=1;int flag=1;while(fabs(x)1e-6)s+=x;k+=2;flag=-flag;x=flag/k;学生在调试这个程序时,未发现错误,可就是结果运行不出来。其实程序是没有任何错误。解决此类问题的办法就是要在程序的前面加上一个头文件#include“math.h”,如果不加这个头文件的话,系统将不认识fabs这个函数。1.15函数定义中未声明形参类型这
7、种情况下调用函数,系统默认把其处理为整型参数,若没有声明函数的类型,返回值也为整型。调用时所有参数以整型传递,会出现参数不匹配的情况。解决办法就是明确定义函数参数的类型和个数。2教学建议结合实际教学过程中出现的问题,我们认为教师可以向学生提出几点建议:(1) C语言编程是一个循序渐进的过程。不要好高骛远,一开始学,就想编写那些很复杂很大的程序,这是不切合实际,要踏踏实实打基础。(2) C语言一定要仔细,不能毛毛草草,该写逗号的地方,就不能写成分号。(3) 学习C语言的过程中,要善于总结、积累。一是积累一些编程的方法、思想,下次再遇到类似的问题,就会有思路。二是要积累编程过程中遇到的错误,最好准备一个小本子,把它记录下来。下次再遇到这样的问题,就会解决了,这样会节省很多时间。3 结束语 以上是笔者教学实践过程中总结出来的学生学习C语言比较容易出错的知识点,这些错误大多是计算机编译时无法检测出来的,而大家又很难发现的错误。其中“循环语句中改变了循环变量的值”和“赋初值的位置不对”,是笔者在实际教学过程中经常发现的错误。笔者总结出的这些问题,希望对C语言教学有一些帮助。
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2