c常见错误有例子

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

C语言编程常见错误Emailazhar1117@163.com1.忘记定义变量就使用例如:voidmain(){x=3;y=x;}在上式中看似正确,实际上却没有定义变量x和y的类型。C语言规定,所有的变量必须先定义,后使用。错误信息:errorC2065:'x':undeclaredidentifierx没有定义errorC2065:'y':undeclaredidentifiery没有定义2、变量没有赋值初就直接使用。例如:#includestdio.hvoidmain(){inti;intsum;i=5;Sum=sum+i;}错误信息warningC4700:uninitializedlocalvariable'sum'used‘sum’在使用前没有初始化3.没有注意数据的数值范围例如:#includestdio.hvoidmain(){charx;x=300;}300的二进制为0b100101100,赋值给x时,将赋值最后的8位,高位截去,因此x的值实际上为0b101100(即整数44)。如果将500赋给一个有符号的字符型变量时,变量内存储的值还会变成负数,由读者自行分析原因。错误信息:warningC4309:'=':truncationofconstantvalue4.对应该有花括号的复合语句,忘记加花括号例如:#includestdio.hvoidmain(){inti=0;intsum=0;while(i10)i++;sum=sum+i;}本程序的目的是计算0到90的累加,但是在循环while的后面少加了花括号,累加的操作并没有在循环中执行。应该修改成这样:while(i10){i++;sum=sum+i;}5.书写标识符时,忽略了大小写字母的区别。voidmain(){inta=5;printf(%d,A);}编译器认为a和A是两个不同的变量名,而显示出错信息。C语言规定大写字母和小写字母是不同的字符;而有些编程语言是不分大小写的。习惯上,符号常量名用大写,变量名用小写表示,以增加可读性。错误信息:errorC2065:'A':undeclaredidentifier‘A’没有定义而直接使用errorC3861:'printf':identifiernotfound没有找到‘printf’的定义。Printf是一个输出函数,定义在stdio.h中。在源程序的开始需要添加#include”stdio.h”6.忽略了变量的类型,进行了不合法的运算。#includestdio.hvoidmain(){floata,b;printf(%d,a%b);}%是求余运算符,a%b的结果是a除以b的余数。只有%左右两边的操作数都是整型时,才可以进行求余运算。故而上面的程序是错误的,因为a和b是浮点型变量。错误信息:errorC2296:'%':illegal,leftoperandhastype'float'%的左边操作数的类型是浮点errorC2297:'%':illegal,rightoperandhastype'float'%的右边操作数的类型是浮点7.将字符常量与字符串常量混淆。#includestdio.hvoidmain(){charc;c=a;}这里就混淆了字符常量与字符串常量,字符常量是由一对单引号括起来的单个字符,字符串常量是一对双引号括起来的字符序列。C语言规定以\0作字符串常量的结束标志,它是由系统自动加上的,所以a实际上包含两个字符:'a'和'\0'。所以把a赋给字符变量是不行的。错误信息:errorC2440:'=':cannotconvertfrom'constchar[2]'to'char'‘=’的左边是字符类型,右边是常量char[2],不能完成赋值操作8.忽略了“=”与“==”的区别。许多高级语言都使用“=”符号作为关系运算符的“等于”。如BASIC程序中可以写:if(a=3)then…但C语言中,“=”是赋值运算符,“==”才是关系运算符。如:if(a==3)a=b;a==3是比较a是否等于3;而a=b;表示把b的值赋给a。初学者往往会把a==3错写成a=3,这样写是符合语法的,但是不符合我们的期望。如果错写成了a=3,有些编译器会给出警告。9.忘记加分号。分号是C语句中不可缺少的一部分,语句末尾必须有分号。voidmain(){inta,b;a=1b=2;}编译时,编译器发现“a=1”后面没有分号,就会报错。改错时,如果在编译器所说的有错的一行中未发现错误,就需要看一下上一行是否漏掉了分号。错误信息:errorC2146:syntaxerror:missing';'beforeidentifier'b'在’b’前面缺少’;’10.多加分号。#includestdio.hvoidmain(){printf(Helloworld.\n);};上面代码中,大括号}后面的分号(;)是毫无必要的!因为单独一个;也是合法的C语言语句,所以}后面写了;也是合法的,但是毫无必要!又如:#includestdio.hvoidmain(){inta=2;intI=0;if(a%3==0);i++;}程序员的本意是如果3整除a,则i加1。但由于if(a%3==0)后加了分号,则if语句到此结束。不论3是否整除a,程序都会执行i++;语句。错误信息:warningC4390:';':emptycontrolledstatementfound;isthistheintent?发现一条空操作语句。再如:#includestdio.hvoidmain(){inti;intx;for(i=0;i5;i++);{scanf(%d,&x);printf(%d,x);}}程序员的本意是先后输入5个数,每输入一个数后再将它输出。但由于for()后加了一个分号,循环体变为空语句;。空语句;执行5次后,下面的程序块才开始执行,导致的结果是只能输入一个数并输出它。11.使用scanf函数时忘记加取址运算符“&”。#includestdio.hvoidmain()[inta,b;scanf(%d%d,a,b);}这样写是错误的!应该改成scanf(%d%d,&a,&b);12.输入数据的方式与要求不符。scanf(%d%d,&a,&b);输入时,不能用逗号作两个数据间的分隔符。例如:3,4。而要使用空格、回车或者tab键作为分隔符。例如:34。如果我们想用逗号(,)来做分隔符,可以这样写:scanf(%d,%d,&a,&b);此时不用逗号而用空格或其它字符是不对的。例如:3:4。又如:scanf(a=%d,b=%d,&a,&b);输入应如以下形式:a=3,b=413.输出的数据类型与所用格式说明符不一致。例如,a定义为整型,b定义为浮点型#includestdio.hvoidmain(){inta=3;floatb=4.5;printf(%f%d\n,a,b);}编译时不给出出错信息,但运行结果将与原意不符。这种错误尤其需要注意。应该改成:printf(%d%f\n,a,b);14.输入数据时,企图规定精度。#includestdio.hvoidmain(){scanf(%7.2f,&a);}这样做是不合法的,输入数据时不能规定精度。15.switch语句中漏写break语句。例如:根据考试成绩的等级打印出百分制数段。switch(grade){case'A':printf(85~100\n);case'B':printf(70~84\n);case'C':printf(60~69\n);case'D':printf(60\n);default:printf(error\n);}由于漏写了break语句,当grade值为A时,printf函数在执行完第一个语句后会接着执行第二、三、四、五个printf函数语句。正确写法应在每个分支后再加上“break;”。例如:case'A':printf(85~100\n);break;16.忽视了while和do-while语句在细节上的区别。(1)#includestdio.hvoidmain(){inta=0,i;scanf(%d,&i);while(i=10){a+=i;++i;}printf(%d,a);}(2)#includestdio.hvoidmain(){inta=0,i;scanf(%d,&i);do{a+=i;++i;}while(i=10);printf(%d,a);}可以看到,当输入i的值小于或等于10时,二者得到的结果相同。而当i10时,二者结果就不同了。因为while循环是先判断后执行,而do-while循环是先执行后判断。对于大于10的数while循环的循环体一次也不执行,而do-while语句则要执行一次。17.定义数组时误用变量。intn=6;inta[n];C99以前,数组名后用方括号括起来必须是常量,包括常量表达式。但是在最新的C99标准中,上面的代码是正确无误的。如果您的编译器不支持C99,那么上面的代码不能通过编译。18.在定义数组时,将定义的“元素个数”误认为是可使的最大下标值。#includestdio.hvoidmain(){inta[10]={1,2,3,4,5,6,7,8,9,10};printf(%d,a[10]);return0;}C语言规定:定义时如果用a[10],则表示数组a有10个元素,其下标值范围为0到9。a[10]不属于上面定义的数组中。对a[10]进行赋值可能导致程序崩溃!错误信息:warningC4700:uninitializedlocalvariable'a'used使用没有初始化的变量。这里指a[10]。19.在不应加地址运算符&的位置加了地址运算符。#includestdio.hvoidmain(){chars[100];scanf(%99s,&s);}C语言中,数组名代表该数组的起始地址。因此上面的代码中,s本身就已经是一个地址了,我们不需要再对它进行取址运算。正确的写法应该是:scanf(%99s,s);附录:A、中英文错误对照Ambiguousoperatorsneedparentheses不明确的运算需要用括号括起Ambiguoussymbol'xxx'不明确的符号Argumentlistsyntaxerror参数表语法错误Arrayboundsmissing丢失数组界限符Arraysizetoolarge数组尺寸太大Badcharacterinparamenters参数中有不适当的字符Badfilenameformatinincludedirective包含命令中文件名格式不正确Badifdefdirectivesynatax编译预处理ifdef有语法错Badundefdirectivesyntax编译预处理undef有语法错Bitfieldtoolarge位字段太长Callofnon-function调用未定义的函数Calltofunctionwithnoprototype调用函数时没有函数的说明Cannotmodifyaconstobject不允许修改常量对象Caseoutsideofswitch漏掉了case语句CasesyntaxerrorCase语法错误Codehasnoeffect代码不可述不可能执行到Compoundstatementmissing{分程序漏掉{Conflictingtypemodifiers不明确的类型说明符Constantexpressionrequired要求常量表达式Constantoutofrangeincomparison在比较中常量超出范围Conversionmaylosesignificantdigits转换时会丢失意义的数?Conversionofnearpointernotallowed不允许转换近指针Couldnotfindfile'xxx'找不到XXX文件Declara

1 / 15
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功