C语言中常见错误分析
作者:单树倩 任佳勋
来源:《电脑知识与技术》2009年第26期
作者:单树倩 任佳勋
来源:《电脑知识与技术》2009年第26期
摘要:C语言是许多高校开设的第一门程序设计语言,使用方便灵活。根据C语言的特点,并结合实际教学,对在编程中经常遇到的错误进行分析、总结,为初学者尽快掌握C语言,提高程序设计水平提供借鉴。
关键词:C语言;常见错误;逻辑错误;指针;变量
中图分类号:TP312文献标识码:A文章编号:1009-3044(2009)26-7447-03
Common Errors in C Language
SHAN Shu-qian1, REN Jia-xun2
(1.North China Electric Power University Science & Technology College, Baoding 07105
1, China; 2.BaoDing LiZhong Wheel Manufacturing CO.,LTD, Baoding 071051, China)
Abstract: C language is the first of many colleges and universities opened the door programming language, easy to use and flexible. According to C language features, combined with the practical teaching, often encountered in the programming errors in the analysis, summarization, as soon as possible for beginners to master c language, raise the level of program design to provide reference.
Key words: C language; common errors; logical errors; pointer; variable
C语言是国内外广泛使用的一种计算机语言。由于其功能丰富、表达能力强、使用方便灵活、应用面广、目标程序效率高、可移植性好等特点,深受广大计算机工作者和应用人员的喜爱。许多高校都将其作为大一学生学习程序设计的入门语言。但C语言牵涉的概念比较复杂,规则多,虽然使用灵活,但是很容易出错。结合实际教学中经验,对学生学习C语言时常见错误进行归纳总结,供初学者借鉴。
1 C语言使用中常见的错误
1.1 大小写错误
C语言规定所有的标识符是区分大小写的;所有的关键字必须为小写。如:sum与SUM就是不同的标识符。
1.2 用户自定义标识符的中错误
在C语言中规定,用户自定义的标识符可以用来区分变量、符号常量、函数名、数组、类型等数据对象c语言错误提示大全,只能由数字、字母、下划线组成且第一个字符必须是字母或者下划线。用户自定义的标识符不能与关键字相同。许多学生在使用过程中经常忘记这一规定。如定义一个整型变量:int char;错误之处在于将关键字char 定义为用户标识符,这是不允许的。
1.3 使用未定义的变量或者变量使用前未赋值
main( ){ int a,b=3;printf(“a=%d,b=%d,c=%d\n”,a,b,c);}
此例中,会得到如下的错误提示:error C2065: 'c' : undeclared identifier执行 cl.exe 时出错。出错原因在于变量c在使用前未定义。
定义变量c之后的程序如下:
main( ){ int a,b=3,c=4;printf(“a=%d,b=%d,c=%d\n”,a,b,c);}
程序运行时并没出现语法错误,运行结果为:a=-858993460,b=3,c=4
从本例可以看出,在定义变量a,b,c的同时,仅完成了对变量b、c的初始化,变量a在使用之前未被赋值,因而得到a=-858993460的结果。此结果的得出是由分配给变量a的内存空间里的数据经转化得到。这个数值是随机值,由分配给a的内存空间里的数值决定。此类错误为逻辑错误,不易察觉。程序可以修改为:
main( ){ int a=2,b=3,c=4;printf(“a=%d,b=%d,c=%d\n”,a,b,c);}
运行结果为:a=2,b=3,c=4
1.4 混淆“=”与“==”
在C语言中,“=”是赋值运算符,表示将“=”右边的值赋给左端的变量,不能做等号使用。“==”才是表示两个数据是否相等的关系运算符。“==”的优先级比“=”高。
例如:
main(){ int a=0,b=1;if (a=b)printf(“a=%d”,a); }
输出结果:a=1
分析:执行if语句时,无论a原来为何值,都被b的值所取代,a值变为1。所以表达式“a=b”的结果永远为非零,if 语句执行,输出结果a=1。
要表示a与b比较的关系,则程序改为:
main(){ int a=0,b=1;if (a==b)printf(“a=%d”,a);}
只有当a和b的值相等时,if语句才执行,输出a的值;否则,if语句结束。
1.5 使用逻辑运算符常出现的错误
逻辑表达式求解时,并非所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。有以下的程序段:
int a=1,b=2,c=3,d=4,m=1,n=1; 执行完语句“ (m=a>b)&&(n=c>d);”后,m和n的值分别为 0和 1。a>b的结果为0,因而m的值变为0。运算符“&&”的第一个运算对象为0(即为假),所以不管右端的表达式(n=c>d)的值为何,逻辑与的结果都为0。因而(n=c>d)是不必运算的,所以n保持原值1,而不是0。
同理:int a=1,b=2,c=3,d=4,m=1,n=1; 执行完语句“ (m=ad);”后,m和n的值分别为1和 1,n保持原值不变。
1.6 对复合语句忘记加花括号“{ }”
有以下程序段:
int i=1,sum =0;
while(i
sum=sum+i;
i++;
程序本意是要执行1+2+...+10,但while语句却是一个死循环。原因是循环语句中的循环体应是由花括号“{}”括起来的一个复合语句。由于在while语句中循环体少了花括号,则循环体仅由一个语句构成,即sum=sum+i;而语句i+ +;则是循环语句的下一条语句,不再是循环体中的语句。由于起循环控制作用的变量i的值始终未被改变,因此构成死循环。根据题意,应将该程序段中的while语句修改为以下形式:
int i=1,sum =0;
while(i
{ sum=sum+i;
i++;
}
1.7 用scanf()函数输入变量值时的错误
1.7.1 漏写取地址运算符“&”
如:int a; scanf(“%d”,a); /* a前漏写& */
C语言中,scanf()函数的输入项必须用地址表示,作用是按照a在内存的地址将输入的数值存入。
1.7.2 输入普通字符也应输入
例如有程序段:int a; scanf(“a=%d”,&a);从键盘输入数值,使a为10。则正确的输入形式应该为:a=10《回车》
如果忘记输入普通字符“a=”,变量a将不会得到正确数值10。
1.8 忽略某些函数的求值顺序
如:main ( )
{intx=100;
printf (“ %d,%d,%d,%d”, x++,x,--x,x);
}
运行结果为:99,99,99,100
这是由于在Turbo c中执行printf()函数时,参数是按照从右到左的顺序被压入栈中的,即先压入x,在压入—x,然后x,最后是x++。弹出时依次为:x++,x,--x,x。因而得到上述结果。
1.9 switch语句中缺少break语句
例:int day;scanf(“%d”,&day);
switch (day)
{case 1 : printf(“Monday”);
case 2 : printf(“Tuesday”);
case 3 : printf(“Wednesday”);
default: printf(“input error!\n”);
}
程序本意是根据变量day的取值(1,2或3),分别打印出Monday,Tuesday,Wednesday否则打印input error。
如果输入day的值为1,打印结果是MondayTuesdayWednesdayinput error而不是我们想象中的Monday。导致此结果原因在于:在执行第一个printf()函数调用语句之后,程序继续执行接下来的三个printf()函数调用语句。这种情况的产生是由于在switch语句中缺少break语句所造成。将上述程序段改为以下形式:
int day;scanf(“%d”,&day);
switch (day)
{case 1 : printf(“Monday”);break;
case 2 : printf(“Tuesday”); break;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论