欢迎来到天天文库
浏览记录
ID:38407211
大小:430.59 KB
页数:63页
时间:2019-06-12
《零点起飞学C之有错也不怕——错误与x》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第23章有错也不怕——错误与调试当程序没有按照程序员的预期执行或意外中断时,就产生了错误。调试就是查找错误发生点、错误原因的过程。程序错误是编程实践中常见的问题,既使最有经验的程序员也不能保证一次就编写出没有任何错误的程序。编写程序的大部分时间实际上就是在进行调试,本章将向读者详细讲解错误和错误的调试,通过本章的学习,读者可以识别程序中的错误,并学会调试和修改这些错误的能力,从而编写出高质量的代码。23.1什么是错误程序错误常直接写做英文的bug,也称为缺陷、臭虫。它指在软件运行中因为程序本身有错误而造成的功能不正常、死机、数
2、据丢失、非正常中断等现象。将程序错误称为bug是由于计算机发展早期的一件事情。二战期间,哈珀中尉带领他的小组制造了一台称为“马克二型”的计算机。一天,马克二型突然死机了。技术人员试了很多办法,最后定位到第70号继电器出错。哈珀观察这个出错的继电器,发现一只飞蛾躺在中间,已经被继电器打死。他小心地用镊子将蛾子夹出来,用透明胶布贴到“事件记录本”中,并注明“第一个发现虫子的实例”。此后,计算机界就习惯将计算机的各种非正常事件都称为bug。按照错误的发生时间不同,可以将错误分成语法错误、链接错误和运行时错误。其中,语法错误发生在编写
3、代码时,也叫编译时错误。链接错误发生在将程序代码链接为可执行程序的过程中。运行时错误则发生在运行程序的过程中。3种错误的排查和解决难度依次为语法错误、链接错误和运行时错误。有时,程序虽然没有发生上述3种错误,但是运行结果却不是预期的,这时就发生了逻辑错误。逻辑错误往往是算法设计错误造成的,本章主要讨论前3种错误类型。23.2错误的种类为了处理错误,首先要搞清楚错误的内容和发生时机。这些错误大多发生在编写源代码,并将源代码转换成可执行程序的过程中。下面详细讲解几种常见的错误。23.2.1语法错误语法错误发生在编写源代码时,指程序
4、中包含了违反语法规则的语句。这类错误在编译时由编译程序自动发现。这类错误很普遍,是初学者最容易犯的错误;也很顽固,即使是最有经验的程序员也难以保证不犯这类错误。【示例23-1】从命令行接受数据并输出。该程序在编译时会输出如下内容。分析:从输出可以看出,该示例共有4个错误。其中,第1个错误是第5行语句中的关键字end书写错误引起的,正确的写法应该是endl。第2个错误是第6行错用了“<<”符号引起的,输入流应该使用“>>”。第3个错误就需要仔细理解了。从输出结果看出错误发生在第8行,错误内容中却说是data前缺少“;”号。这说明
5、是第7行缺少“;”号,导致两行连在了一起,但是编译器发现这两行是两条独立的语句,所以提示8行有错。第4个错误是8行括号不全引起的,应该在“3”后补一个“)”。所有程序员终生都要受语法错误的困扰,即使再小心仔细也难以避免。但是语法错误也是最容易处理和发现的。只要按照提示找到错误点,根据错误内容修改即可。这类错误只能随着经验的积累逐步的减少,却不能根除。有时编译器还会对某些语句给出警告,例如,将浮点数赋给整型数,将很小的数作为被除数等。这些不是错误,但却潜在地存在问题,也是需要高度重视的。23.2.2链接错误链接错误发生在程序链接
6、时。将编译过的程序与程序使用的库链接生成可执行程序时,如果不能在所有的库和目标文件内找到所引用的函数、变量或标识符,就会产生链接错误。这常常是符号不存在、拼写不正确或者使用错误引起的。【示例23-2】链接错误的示例代码。该程序编译链接时,会有如下输出。分析:从输出可以看出示例代码除了仅有一个数据转换警告外,已经通过了编译,可以不管这个警告。下面可以看出有3个链接错误。第1个是提示函数fun()找不到。这是因为声明的fun()函数的参数为浮点型,但定义时却错写成了整型,所以链接程序认为找不到参数为浮点型的fun()函数。第2个错
7、误是声明了外部变量x,但是却没有找到定义它的库文件。第3个是提示有两个无法找到的外部引用,所以导致不能链接为可执行程序。一般来讲,可以将链接错误分为工程内链接错误和工程外链接错误两种。其中,工程内链接错误指工程内使用的对象在链接时未能找到,是代码级别的。工程外链接错误指工程使用的外部对象未能找到,一般是使用外部编译好的库造成的。下面分别予以说明。1.工程内链接错误这包括函数或变量不存在和函数或变量所在的文件没有被正确编译两种。其中,前者发生的原因是由于函数和变量只声明未定义,函数声明和定义的参数列表不一致,或者拼写错误等。后者
8、是由于函数和变量所在的文件没有加到工程中,预处理宏或条件编译导致函数或变量没有被正确编译等。2.工程外链接错误这包括链接的函数或变量没有被正确导入,找不到链接的库文件,调用方式错误等。注意:如果程序中用到了外部库或头文件,则需要在“toolsoptions”的direc
此文档下载收益归作者所有