2022年2022年辽宁石油化工大学《C语言程序设计》常见错误和程序调试 .pdf
《2022年2022年辽宁石油化工大学《C语言程序设计》常见错误和程序调试 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年辽宁石油化工大学《C语言程序设计》常见错误和程序调试 .pdf(17页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第 10 章常见错误和程序调试Common error and program debug本章概要Summary of the chapter 程序调试是程序设计过程中一个必不可少的环节,调试过程中的错误处理则是保证程序正确性的必要手段。本章将常见的一些错误列举出来,以方便进行程序调试。C 语言是一种介于高级语言与低级语言之间的中级语言,允许直接访问物理地址,能进行位操作, 可以直接对硬件进行操作。 程序员使用 C 语言编写程序会感到限制少、 灵活性较大、功能强,可以编写出能解决复杂问题的、 运行效率高、占用内存少的高质量程序,不仅用来编写系统软件,也用来编写应用软件,所以得到广泛应用。正因为
2、如此,C 语言受到愈来愈广泛的重视,从初学者到高级软件人员,都在学习C 和使用 C 语言。但是要真正学好、用好C 并不容易。因为 C 语言允许编程人员有较大的自由度,从而放宽了语法检查, C 编译程序对语法的检查不如其他高级语言那样严格,因此,往往要由程序设计者自己设法保证程序的正确性。这就使人感到难以掌握,尤其是初学者,容易出错,出了错还不知什么原因、如何处理。另外,C 语言有些语法规定和其他高级语言不同,学习过其他高级语言的读者往往按照使用其他高级语言的习惯来写C 程序,这也是出错的一个原因。调试一个 C 程序要比调试一个其它高级语言的程序更困难一些。需要不断积累经验,提高程序设计和调试程
3、序的水平。10.1常见错误分析(Common error analyse)程序出错有三种情况:语法错误。由于违背了 C 语言的语法规定而引起的。 如双引号或括号不全、do-while语句缺少 while、使用关键字作变量名等, 对这类错误,编译程序一般都能检测出来, 给出“出错信息” 。并且告诉你在哪一行出错。只要细心,是可以很快发现并排除的。逻辑错误。由于程序的结构或算法错误引起的。程序并没有语法错误,程序运行过程中也没有发生错误,只是最后的运行结果并不是希望的结果。例如,有下面的程序段:main( ) int sum=0, i=1; while(i=100) 名师资料总结 - - -精品资
4、料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 17 页 - - - - - - - - - 204 第 10 章常见错误和程序调试sum=sum+i; i+; printf(%dn, sum); 语法并无错误。 但程序运行时陷入 “死循环” ,因为 while 循环语句中,起判断条件的表达式“i=100”始终为“真” 。C 系统无法辨别程序中这个语句是否符合设计者的原意,而只能忠实地执行这一指令。 这种错误比语法错误更难检查。 要求程序员有较丰富的经验。运行错误。程序既无语法错误, 也无逻辑错误,但
5、在运行时出现错误甚至停止运行。例如:main( ) int a, b, c; scanf(%d%d, &a, &b); c=b/a; printf(%dn, c); 程序没有语法错误,但是程序运行过程中,如果输入数据时a 的值为 0,就会产生:Division by zero的错误,即在除法运算中“ 0”作了除数。C 程序错误检测的首要工具是编译程序, 它能把语法上的错误找到并分离出来以信息的形式显示,显示的信息分:错误(error)和警告 (warning)。错误(error)将影响程序执行,而警告 (warning)一般不影响程序的执行,但会影响结果的正确性。下面将初学者在学习和使用C 语
6、言时容易犯的错误列举出来, 这些内容在前面各章中大多己谈到,为便于查阅,在本节集中列举,供初学者参考。1数据定义类错误 (Error of data definition classes) (1)忘记定义变量。如有:main( ) x=3; y=6; z=x+y; printf(%dn, z); 编译时将出现 error信息:Undefined symbol xxx 原因是 C 要求对程序中用到的每一个变量都必须先定义后使用, 上面程序中没有对 x、y、z 进行定义。应在函数体的开头加上:int x, y, z; 另外还要注意, C 语言中标识符的大小写是不同的,如果定义与使用时大小写不一致也
7、会出现这样的错误。如有int a=2, b=3, c; c=a+B; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 17 页 - - - - - - - - - 第 10 章常见错误和程序调试 205 系统会认为“ B”没有定义。这是学过BASIC 语言的读者常犯的错误,因为BASIC语言中标识符不分大小写。也可能出现下面情况:Float f; 这也是不合法的, C 语言的关键字不允许大写。(2)定义变量的位置错误。如:main( ) int a, b; scanf(%
8、d%d, &a, &b); int c; c=a+b; printf(%d, c); 编译时将出现 error信息:Expression syntax 原因是将变量定义“ int c; ”放在执行语句后面,系统将其作为一个表达式语句处理,而不再作为变量的定义。(3)定义整型变量时没有考虑其数值范围。如有:int a; a=45678; printf( d,a); 编译时并无错误,但输出的值不是 45678, 而是-19858, 原因是 int 数的范围为-215215-1,即-3276832767 ,45678已超出了 int 型的数值范围。为此可以采用long 型,即改为long int a
9、; a=45678; printf( ld,a); 请注意,如果只定义 a为 long 型,而在输出时仍用“ d”说明符,仍会出现以上错误。(4)混淆字符与字符串的区别。如有:char c=a; 编译时将出现 warning信息:Non-portable pointer assignment 原因是定义的字符变量 c 只能存放一个字符, 但赋给它的值 a是字符串,它包含两个字符a和0。C 语言对字符串按字符数组处理,是一个指针量,所以系统认为程序将一个指针量赋给了一个非指针量。改正时,要么将c 定义为字符数组或指针变量,要么按以下方式给字符变量赋值。 直接赋以字符常量,如: char c=a;
10、 赋以“转义字符”,如:char c=0; 赋以一个字符的 ASCII 码,如: char c=97; (5)曾经定义并给变量赋值,但程序中没有使用该变量。如有:main( ) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 17 页 - - - - - - - - - 206 第 10 章常见错误和程序调试int a=1, b=2, c=3; printf(%d, %d, a, b); 编译时将出现 warning信息:c is assigned a value whi
11、ch is never used (6)宏定义或文件包含时漏掉了“ #”号。如有:defint PI 3.14159 或include stdio.h 编译时将出现 error信息:Declaration syntax error (7)混淆结构体类型与结构体变量的区别。如有:struct student long int num; char name20; char sex; ; student.num=123; strcpy(student.name, zhangfang); student.sex=M; 编译时将出现 error信息:Undefined symbol student Il
12、legal structure operation 原因是混淆了结构体类型与结构体变量的区别,student是定义的结构体类型而不是结构体变量,直接对结构体类型 student进行操作是非法的。 应当在结构体类型定义的同时或之后,定义一个属于该类型的变量,如:struct student stu; 然后对结构体变量 stu进行相应的操作。2格式类错误 (Error of format classes) (1)语句后面遗漏分号。如有:printf(Good morning?n) 编译时的错误信息为:Statement missing ;原因是分号是 C 程序中语句的必要组成部分, 每个语句必须以
13、分号结束。 这也是与其它高级语言不同的地方。 如果是复合语句, 有些初学者往往遗漏最后一个语句的分号。 如: t=a; a=b; b=t (2)在不该加分号的地方加了分号,如有:for(i=0; i10; i+); scanf(%d, ai); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 17 页 - - - - - - - - - 第 10 章常见错误和程序调试 207 程序并无错误, 但程序的执行结果与原意不符。 程序的本意是用 for 循环输入 10 个整数给一
14、维数组,但在for 后面加上分号后,就单独构成了一个语句,成为一个空循环,实现不了设计思想。这种错误属于逻辑错误。请读者注意,这是一个常见的错误,尤其是在if、for、while 语句中要特别注意。(3)括弧不配对。包括三种情况:花括号、中括号、圆括号不配对。这类错误,纯属粗心所致。花括号不配对,编译将会出现error信息:Compound statement missing 当一个语句中使用多层花括弧时常出现这种错误。中括号不配对,由于形式不同,编译时出现error 信息也不相同,主要在数组的定义或引用中出现这种错误。圆括号不配对,由于形式不同,编译时出现error 信息也各不相同,主要出现
15、在需要使用多层圆括号的复杂表达式中、函数调用中及带圆括号的语句中,像if、switch、for、while、do-while 等语句。如:while(c=getchar( )!=#) putchar(c); 编译时出现 error信息:Call of non-function While statement missing ) 系统认为调用了没有定义的函数并且while 语句后的圆括号不配对。(4)赋值格式错误。如有:b+=a+7; 编译时将出现 error信息:Lvalue required 原因是赋值号“ =”左边应该是变量,而不能是表达式。将表达式a+7 的值赋给表达式 b+是不符合 C
16、 语法规定的。另外,当对符号常量重新赋值时也会出现这种错误。 如有:#define PRICE 30 PRICE=40; 编译系统也会认为“PRICE=40 ” 这个赋值表达式不符合 C语言的语法规定。因为 PRICE是一个符号常量,而不是变量。(5)输入输出的数据的类型与所用格式说明符不一致。如:int a=3; float b=4.5; printf(%f %dn, a, b); 编译时并无出错信息,但运行结果将与原意不符,输出结果为0.000000 l6402 原因是系统并不是按照赋值的规则进行数据转换的(如把 4.5 转换成 4), 而是将数据在存储单元中的具体存放形式按格式符的要求重
17、新组织进行输出的。变量b 在内存中占 4 个字节,输出时只把最后两个字节中的数据按d 格式输出。这属于逻辑上的错误。输入输名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 17 页 - - - - - - - - - 208 第 10 章常见错误和程序调试出数据时一定要注意数据类型与格式说明一致,可改为 printf(%d %fn, a, b); (6)scanf函数中忘记使用地址运算符 &。如:main( ) int a, b,sum; scanf(%d%d, a, b)
18、; sum=a+b; printf(sum=%dn, sum); 编译时将出现 warning信息:Possible use of a before definition Possible use of b before definition 原因是系统认为变量 a、b 在参加运算前没有被赋值。用scanf函数给变量输入数据,是要把数据放到变量在内存所占的存储单元中去,如果不使用地址运算符&,就得不到变量的地址,所以变量 a、b就得不到数据。这是许多初学者刚学习 C 语言时一个常见的疏忽, 或者说是习惯性的错误。 因为在其他语言中输入数据时只需写出变量名即可(如BASIC 语言中的 INPUT
19、 语句) ,而 C 语言要求必须指明“向哪个地址标识的单元送值” 。应写成scanf(%d%d, &a, &b); 另外,在程序中直接使用未赋值的变量时,也出现这样的警告信息。如有:int a, b; a=b; (7)输入时数据的组织与要求不符。用 scanf函数输入数据,应注意输入数据的格式,如有:scanf(%d%d,&a, &b); 有人按下面的方法输入数据:3,4 这是错误的。可以用printf(%d%d, a, b); 来验证一下,输出的结果与输入的原始数据是不同的。 输入时数据间应该用空格 (或 Tab键,回车键)来分隔,即应该用以下方法输入:3 4 如果 scanf函数为:sca
20、nf(%d,%d, &a,&b); 格式字符串中除了格式说明符外, 对其他字符必须按原样输入。 因此,应按以下方法输入:3,4 此时如果用“ 3 4 ”反而错了。还应注意,不能企图用scanf(input a &b: %d, %d, &a, &b); 想在屏幕上显示一行信息:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 17 页 - - - - - - - - - 第 10 章常见错误和程序调试 209 input a & b: 然后在其后输入 a和 b 的值,这是不行
21、的,只能写成:printf(input a & b:); scanf(%d,d,a, &b); scanf与 BASIC 语言中 INPUT 语句的功能并不完全相同。(8)混淆赋值号( =)与比较符( = =) 。如有:if(a=b) printf(a equal b); 编译时将出现 warning信息:possibly incorrect assignment 原因是系统认为程序中将一个赋值表达式“a=b”作为 if 语句的条件表达式。这种错误在 if、while 或 do-while 语句中常见。也是学过 BASIC 语言常犯的错误,因为在 BASIC语言中, “=”既可作为赋值号,也可
22、作为关系运算符“等于” ,但在 C 中, “=”是赋值运算符, “= =”才是比较用的关系运算符“等于” 。(9)错误引用寄存器变量的地址。如有:register int a; scanf(%d%d, &a, &b); 或有:register int a; int *p; p=&a; 编译时将出现 error信息:Must take address of memory location 原因是地址运算符 &只能取内存单元的地址,而不能取寄存器变量的地址。寄存器变量没有地址。(10)do语句中少了 while。如有:do sum=sum+n; n+; 编译时将出现 error信息:Do stat
23、ement must have while (11)do语句后 while 缺少分号do sum=sum+n; n+; while(n=100) 编译时将出现 error信息:Do-while statement missing ; (12)switch 语句的各分支中漏写 break语句。如有:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 17 页 - - - - - - - - - 210 第 10 章常见错误和程序调试switch(score) case 5:pr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言程序设计 2022年2022年辽宁石油化工大学C语言程序设计常见错误和程序调试 2022 辽宁 石油化工 大学 语言程序设计 常见 错误 程序 调试
限制150内