C语言常见错误与分析.docx
C语言常见错误与分析
错误分类
语法错
逻辑错
运行错
忘记定义变量
main()
{ x=3;y=6;
printf(%d\n,x+y);
}
C语言的变量一定要先定义才能使用;
输入输出的数据的类型与所用格式说明符不一致
inta=3;floatb=4.5;
printf(%f%d\n,a,b);
这时不会按赋值的规则进行转换(如把4.5转换为4)再输出,而是将数据在存储单元中的形式按格式符的要求组织输出(如b占4个字节,只把最后两个字节的数据按%d,作为整数输出)。所以会输出错误的结果。
未注意数据类型的数值范围
在一些编译系统中int类型等同于shortint,范围是-32768~32767。
intnum=89101;printf(%d,num);
上面的代码会将超过低16位的数截去,从而得到23563。
注意:在一些系统中若定义了long型,而在输出时仍用“%d”说明符,仍会出现以上错误。
输入变量的语句中时忘记使用地址符
scanf(%d%d,a,b);
输入时数据的组织与要求不符
scanf函数格式字符串,除了格式说明符外,对其他字符必须按原样输入。
误把赋值号“=”作为“等于”比较符“=” 为赋值运算符
“==” 为关系运算中的“相等”
语句后面漏分号
{t=a;a=b;b=t
}
不该加分号的地方加了分号
if(ab);
printf(aislargerthanb\n);for(i=0;i10;i++);
{
scanf(%d,x);
printf(%d\n,x*x);
}
复合语句漏写花括弧
sum=0;i=1;
while(i=100)sum=sum+1;i++;
括弧不配对
while((c=getchar()!=#)putchar(c);
使用标识时,没有区分大写字母和小写字母
inta,b,c;a=2;b=3;C=A+B;
printf(“%d+%d=%D”,A,B,C)
引用数组元素时,误用圆括号(因为有一些编程语言用圆括号表示下标,故某些人有此习惯)
inti,a(10);
for(i=0;i10;i++)scanf(%d,a(i));
定义数组时,将定义的元素个数误认为是可使用的最大下标值(这也是其他编程语言带来的习惯)
inta[10]={1,2,3,4,5,6,7,8,9,10};
inti;for(i=1;i=10;i++)printf(%d,a[i]);
对二维或多维数组的定义和引用的方法不对
inta[5,4];
…
printf(%d,a[1+2,2+2]);
误以为数组名代表数组中全部元素
inta[4]={1,2,3,4};
printf(%d%d%d%d,a);
混淆字符数组与字符指针的区别
charstr[40];str=Computerandc;printf(%s\n,str);
在引用指针变量之前没有对它赋予确定的值
char*p;scanf(%s,p);
switch语句的各分支中漏写break语句
混淆字符和字符串的表示形式
charsex;sex=M;
使用自加(++)和自减(--)运算符错误
(2) char*p,c[20];
p=c;scanf(%s,p);
int*p,a[5]={1,3,5,7,9};
p=a;
printf(%d,*p++); //注意与*(++p)的区别;
被调函数的定义在调用语句之后,而在调用前未加说明
intmain()
{ floatx,y,z;
x=3.5;y=-7.6;
z=max(x,y);printf(%f,z);
}
floatmax(floatx,floaty)
{ return(xy?x:y);
}
误认为形参值的改变会影响实参的值
swap(intx,inty)
{ intt;t=x;x=y;y=t;
}
intmain()
{ inta,b;a=3;b=4;
swap(a,b);printf(%d,%d\n,a,b);
}
函数的实参和形参类型不一致
fun(floatx,floaty)
{
}
intmain()
{
inta=3,b=4;c=fun(a,b);
…
}
不同类型指针混用
inti=3,*p1;floata=1.5,*p2;p1=i;p2=a;p2=p1;
printf(%d,%d\n,*p1,*p2);
没有注意函数参数的求值顺序
inti=3;
printf(%d,%d,%d\n,i,++i,++i);
结果为5,5,4
因为C标准没有具体规定函数参数求值的顺序,VC++是采取自右至左的顺序求