常见错误分析Word文档下载推荐.docx
- 文档编号:15696059
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:15
- 大小:23.94KB
常见错误分析Word文档下载推荐.docx
《常见错误分析Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《常见错误分析Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
在FORTRAN中,未经定义类型的变量按隐含的I-N规则决定其类型,而C语言则要求对用到的每一个变量都要在本函数中定义(除非已定义为外部变量)。
(2)输入输出的数据的类型与所用格式说明符不一致。
例如,若a已定义为整型,b已定义为实型。
a=3;
b=4.5;
printf("
%f %d\n"
,a,b);
•编译时不给出出错信息,但运行结果将与原意不符,输出为
•0.00000016402
•它们并不是按照赋值的规则进行转换(如把4.5转换成4),而是将数据在存储单元中的形式按格式符的要求组织输出(如b占4个字节,只把最后两个字节中的数据按%d,作为整数输出)。
(3)未注意int型数据的数值范围。
一般微型计算机上使用的C编译系统,对一个整型数据分配两个字节。
因此一个整数的范围为
-215~215-1,即-32768~32767。
常见这样的程序段:
intnum;
num=89101;
%d"
,num);
得到的却是23565,原因是89101已超过32767。
两个字节容纳不下89101,则将高位截去。
见图16.1。
即将超过低16位的数截去。
即将89101减去216(即16位二进制所形成的模)。
89101-65536=23565。
有时还会出现负数。
例如
num=196607;
输出得-1。
因为196607的二进制形式为
00000000000000101111111111111111
去掉高位10,低16位的值是-1(-1的补码是:
1111111111111111)。
对于超过整个范围的数,要用long型,即改为
longint num;
%ld"
请注意,如果只定义num为long型,而在输出时仍用“%d”说明符,仍会出现以上错误。
(4)输入变量时忘记使用地址符。
scanf("
%d%d"
这是许多初学者刚学习C语言时一个常见的疏忽,或者说是习惯性的错误,因为在其他语言中在输入时只需写出变量名即可,而C语言要求指明“向哪个地址标识的单元送值”。
应写成scanf("
,&
a,&
b);
(5)输入时数据的组织与要求不符。
用scanf函数输入数据,应注意如何组织输入
数据。
假如有以下scanf函数:
有人按下面的方法输入数据:
3,4
这是错的。
数据间应该用空格来分隔。
读者可以用
来验证一下。
应该用以下方法输入:
34
如果scanf函数为
%d,%d"
对scanf函数中格式字符串中除了格式说明符外,
对其他字符必须按原样输入。
因此,应按以下方法输入:
此时如果用“34”反而错了。
还应注意,不能企图用
inputa&
b:
想在屏幕上显示一行信息:
然后在其后输入a和b的值,这是不行的。
这是由于有的读者以为scanf具有BASIC语言中的INPUT语句的功能(先输出一个字符串,再输入变量的值)。
如果想在屏幕上得到所需的提示信息,可以另加一个printf函数语句:
"
);
(6)误把“=”作为“等于”比较符。
在许多高级语言中,用“=”符号作为关系运算符“等于”。
例如,在BASIC或PASCAL程序中都可以写
if(a=b) then…
但在C语言中,“=”是赋值运算符,“==”才是关系运算符“等于”。
如果写成
if(a=b) printf("
aequaltob"
C编译系统将(a=b)作为赋值表达式处理,将b的值赋给a,然后判断a的值是否零,若为非零,则作为“真”;
若为零作为假。
如果a的值为3,b的值为4,
a≠b,按原意不应输出“aequaltob”。
而现在先将b的值赋给a,a也为4,赋值表达式的值为4。
if语句中的表达式值为真(非零),因此输出“aequaltob”。
这种错误在编译时是检查不出来的,但运行结果往往是错的。
而且由于习惯的影响,程序设计者自己往往也不易发觉。
(7)语句后面漏分号。
C语言规定语句末尾必须有分号。
分号是C语句不可缺少的一部分。
这也是和其他语言不同的。
有的初学者往往忘记写这一分号。
a=3
b=4
编译时,编译程序在“a=3”后面未发现分号,就把下一行“b=4”也作为上一行的语句的一部分,这就出现语法错误。
有时编译时指出某行有错,但在该行上并未发现错误,应该检查上一行是否漏了分号。
如果用复合语句,有的学过PASCAL语言的读者往往漏写最后一个语句的分号,如:
{t=a;
a=b;
b=t
在PASCAL中分号是两个语句间的分隔符而不是语句的一部分,而在C中,没有分号的就不是语句。
(8)在不该加分号的地方加了分号。
例如:
if(a>b);
aislargerthanb\n"
本意为当a>b时输出“a is largerthanb”的信息。
但由于在if(a>b)后加了分号,因此if语句到此结束。
即当(a>b)为真时,执行一个空语句。
本来想a≤b时不输出上述信息,但现在printf函数语句并不从属于if语句,而是与if语句平行的语句。
不论
a>b还是a≤b,都输出“aislargerthanb”。
又如:
for(i=0;
i<10;
i++);
{scanf("
x);
%d\n"
,x*x);
本意为先后输入10个数,每输入一个数后输出它的平方值。
由于在for( )后加了一个分号,使循环体变成了空语句。
只能输入一个整数并输出它的平方值。
总之,在if、for、while语句中,不要画蛇添足多加分号。
(9)对应该有花括弧的复合语句,忘记加花括弧。
sum=0;
i=1;
while(i<=100)
sum=sum+i;
i++;
本意是实现1+2+…+100,即∑i。
但上面的语句只是重复了sum+1的操作,而且循环永不终止。
因为i的值始终没有改变。
错误在于没有写成复合语句形式。
因此while语句的范围到其后第一个分号为止。
语句“i++;
”不属于循环体范围之内。
应改为
{sum=sum+i;
}
(10)括弧不配对。
当一个语句中使用多层括弧时常出现这类错误,纯属粗心所致。
while((c=getchar( )!
='
#'
)
putchar(c);
少了一个右括弧。
(11)在用标识符时,忘记了大写字母和小写字母的区别。
{inta,b,c;
a=2;
b=3;
C=A+B;
%d+%d=%"
,A,B,C);
编译时出错。
编译程序把a和A认作是两个不同的变量名处理,同样b和B,c和C都分别代表两个不同的变量。
(12)引用数组元素时误用了圆括弧。
{inti,a(10);
for(i=0;
i++)
scanf("
a(i));
C语言中对数组的定义或引用数组元素时必须用方括弧。
(13)在定义数组时,将定义的“元素个数”误认为是“可使用的最大下标值”。
{inta[10]={1,2,3,4,5,6,7,8,9,10};
inti;
for(i=1;
i<=10;
,a[i]);
想输出a[1]到a[10]。
但一些初学者常犯的错误。
C语言规定定义时用a[10],表示a数组有10个元素,而不是可以用的最大下标值为10。
数组只包括a[0]到a[9]10个元素,因此用a[10]就超出a数组的范围了。
•(14)对二维或多维数组的定义和引用的方法不对。
{inta[5,4];
,a[1+2,2+2]);
对二维数组和多维数组在定义和引用时必须将每一维的数据分别用方括弧括起来。
上面a[5,4]应改为a[5][4],a[1+2,2+2]应改为a[1+2][2+2]。
根据C的语法规则,在一个方括弧中的是一个维的下标表达式,a[1+2,2+2]中方括弧中的“1+2,2+2”
是一个逗号表达式,它的值是第二个数值表达式的值,即2+2的值为4。
所以a[1+2,2+2]相当于a[4]。
而a[4]是a数组的第4行的首地址。
因此执行printf函数输出的结果并不是a[3][4]的值,而是a数组第4行的首地址。
•(15)误以为数组名代表数组中全部元素。
{inta[4]={1,3,5,7};
%d%d%d%d\n"
,a);
企图用数组名代表全部元素。
在C语言中,数组名代表数组首地址,不能通过数组名输出4个整数。
•(16)混淆字符数组与字符指针的区别。
{charstr[4];
str="
Computerandc"
;
%s\n"
,str);
编译出错。
str是数组名,代表数组首地址。
在编译时对str数组分配了一段内存单元,因此在程序运行期间str是一个常量,不能再被赋值。
因此,
str=“Computerandc”是错误的。
如果把“charstr[4];
”改成“charstr;
”,则程序正确。
此时str是指向字符数据的指针变量,str=“Computerandc”是合法的,它将字符串的首地址赋给指针变量str,然后在printf函数语句中输出字符串“Computerandc”。
因此应当弄清楚字符数组与字符指针变量用法的区别。
•(17)在引用指针变量之前没有对它赋予确定的值。
{char*p;
%s"
,p);
没有给指针变量p赋值就引用它,编译时给出警告信息。
应当改为
charp,c[20];
p=c;
即先根据需要定义一个大小合适的字符数组c,然后将c数组的首地址赋给指针变量p,此时p有确定的值,指向数组c。
再执行scanf函数就没有问题了,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 常见 错误 分析