常见错误与程序调试
(1) 忘记定义变量。 如:
main( ) {x=3;
y=6; printf(%d\n ,x+y); }
(2) 输入输出的数据的类型与所用格式说明符不一致。 例如,若a已定义为整型, b已定义为实型。
a=3;b=4 .5; printf(%f 搥屜屮,a,b); 编译时不给出出错信息,但运行结果将与原意不 符,输出为 0.000000 16402 它们并不是按照赋值的规则进行转换 (如把4.5 转换成 4) ,而是将数据在存储单元中的形式按格 式符的要求组织输出 (如b占4个字节,只把最后 两个字节中的数据按 %d,作为整数输出 )。
总之,在 if、for、while 语句中,不要画蛇添足多加分号。
(9) 对应该有花括弧的复合语句,忘记加花括弧 。 如:
sum=0;
i=1; while(i <=100)
sum=sum+i;
i++; 100
本意是实现 1+2+…+100 ,即∑i。但上面的语句只是 i=0
重复了sum+1的操作,而且循环永不终止。因为 i的 值始终没有改变。错误在于没有写成复合语句形式。 因此while语句的范围到其后第一个分号为止。语句 “i++;”不属于循环体范围之内。
(4) 输入变量时忘记使用地址符。 如:
捳湡?╜╤層 ,a,b); 这是许多初学者刚学习 C语言时一个常见的疏忽, 或者说是习惯性的错误,因为在其他语言中在输入 时只需写出变量名即可,而 C语言要求指明“向哪 个地址标识的单元送值”。应写成 捳湡?╜╤層 , &a,&b);
(5) 输入时数据的组织与要求不符 。
对其他字符必须按原样输入。因此,应按以下方 法输入:
3,4 此时如果用“ 34”反而错了。还应注意,不能企图用 scanf(input a & b :%d,搥 ,&a,&b);
想在屏幕上显示一行信息:
input a & b : 然后在其后输入 a和b的值,这是不行的。这是由于 有的读者以为 scanf具有BASIC语言中的INPUT语句 的功能(先输出一个字符串,再输入变量的值 )。如 果想在屏幕上得到所需的提示信息,可以另加一个 printf函数语句: printf(input a & b :);
用scanf 函数输入数据,应注意如何组织输入
数据。假如有以下 scanf函数: 捳湡?╜╤層 ,&a,&b); 有人按下面的方法输入数据: 3,4 这是错的。数据间应该用空格来分隔。读者可以用 牰湩晴尨搥搥 ,a,b); 来验证一下。应该用以下方法输入:
34 如果 scanf 函数为 scanf(%d ,搥 ,&a,&b); 对scanf函数中格式字符串中除了格式说明符外,
(10) 括弧不配对。 当一个语句中使用多层括弧时常出现这类错误,
纯属粗心所致。如: while((c=getchar( )!='#')
putchar(c); 少了一个右括弧。
(11) 在用标识符时,忘记了大写字母和小写字母的 区别。
例如:
main( ) {int a,b,c;
a=2;b=3;
C=A+B; 牰湩晴尨搥┫?尥 ,A,B,C);
(3) 未注意int型数据的数值范围。 一般微型计算机上使用的 C编译系统,对一个整型 数据分配两个字节。因此一个整数的范围为
-215 ~215-1 ,即 -32768 ~32767 。常见这样的程 序段: int num;
num=32767; 牰湩晴尨搥,num+1);
得到的却是 -32768,原因是32768超过32767。变 成补码形式
如果用复合语句,有的学过 PASCAL语言的读者往 往漏写最后一个语句的分号 ,如:
{t=a;
a=b;
b=t }
在PASCAL 中分号是两个语句间的分隔符而不是语句 的一部分,而在 C中,没有分号的就不是语句。 (8) 在不该加分号的地方加了分号。 例如: if(a>b);
printf(a is larger than b\n);
第十四章
? 主要内容
14.1 常见错误分析 14.2 程序调试
要真正学好 C、用好C并不容易,“灵活”固然是好 事,但也使人难以掌握,尤其是初学者往往出了错 还不知怎么回事。 C编译程序对语法的检查不如其 他高级语言那样严格 (这是为了给程序人员留下“灵 活”的余地 )。因此,往往要由程序设计者自己设法 保证程序的正确性。调试一个 C程序要比调试一个 PASCAL或FORTRAN 程序更困难一些。需要不断 积累经验,提高程序设计和调试程序的水平。
} 编译时出错。编译程序把 a和A认作是两个不同的变 量名处理,同样 b和B,c和C都分别代表两个不同的 变量。
C语言有些语法规定和其他高级语言不同,学习过 其他高级语言的读者往往按照使用其他高级语言的 习惯来写 C程序,这也是出错的一个原因。
14.1 常见错误分析
下面将初学者在学习和使用 C语言(不包括C++)时容 易犯的错误列举出来,以起提醒的作用。这些内容 在以前各章中大多已谈到,为便于查阅,在本章中 集中列举,供初学者参考,以此为鉴。
这种错误在编译时是检查不出来的,但运行结果往 往是错的。而且由于习惯的影响,程序设计者自己 往往也不易发觉。
(7) 语句后面漏分号。
C语言规定语句末尾必须有分号。 分号是C语句不可 缺少的一部分。这也是和其他语言不同的。=3
b=4 编译时,编译程序在“ a=3”后面未发现分号,就把 下一行“ b=4”也作为上一行的语句的一部分,这就 出现语法错误。有时编译时指出某行有错,但在该 行上并未发现错误,应该检查上一行是否漏了分号。
scanf(%d ,搥 ,&a,&b);
(6) 误把“=”作为“等于”比较符。
C编译系统将(a=b)作为赋值表达式处理,将 b的值 赋给 a,然后判断 a的值是否零,若为非零,则作为 “真”;若为零作为假。如果 a的值为3,b的值为4,
a≠b,按原意不应输出“ ae q u a lt ob”。而现在 先将b的值赋给a,a也为4,赋值表达式的值为 4。if 语句中的表达式值为真 (非零),因此输出“ ae q u a lt o b”。