C++ Testing and Debugging翻译-20130312

上传人:s9****2 文档编号:487141795 上传时间:2022-09-30 格式:DOC 页数:17 大小:62.50KB
返回 下载 相关 举报
C++ Testing and Debugging翻译-20130312_第1页
第1页 / 共17页
C++ Testing and Debugging翻译-20130312_第2页
第2页 / 共17页
C++ Testing and Debugging翻译-20130312_第3页
第3页 / 共17页
C++ Testing and Debugging翻译-20130312_第4页
第4页 / 共17页
C++ Testing and Debugging翻译-20130312_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《C++ Testing and Debugging翻译-20130312》由会员分享,可在线阅读,更多相关《C++ Testing and Debugging翻译-20130312(17页珍藏版)》请在金锄头文库上搜索。

1、面向对象程序设计(C+)课程系列辅导书Testing and Debugging(测试和调试)参考译文信息技术与传播学院2013年3 月第二章1. 对于任一非C+保留字的标识符必须要声明。如果你使用了一个未被声明的标识符(既没有自己用语句声明或也没有包含相应的头文件),你将得到出错信息。2. 如果想试图声明一个和C+保留字相同的标识符,编译器会给出一条出错信息。附录A列出了C+的保留字。3. C+语言对大小写敏感:两个大小写不同的标识符会被视为是两个不同的标识符。而main和C+其它所有的保留字都只是用小写字母。4.为了使用标准库中的标识符,例如cout和 string,你必须采用如下方法之一

2、:或者使用限定的名字,如std:cout;或者在程序的头部附近使用using指令:“using namespace std;”。5. 检查字符和文字串中不匹配的引号。每个字符的开头和结尾都是撇号(单引号),而每个文字串是以双引号开头和结尾。6. 请确保仅使用单撇号()来包含字符文字。大多键盘上都有个很容易与其混淆的反向撇号()。如果你使用了这个反向撇号,编译器就会给出出错信息。7. 要在文字串中使用双引号,那么在一行中使用这两个符号”。如果仅使用双引号,那么它将结束此串,编译器就会把串的剩余部分视为错误。8. 在赋值语句中,确保“=”左边的标识符是个变量而不是命名常量。9. 当把一个数赋值给字

3、符串变量时,“=”右边的表达式必须是个字符串表达式、文字字符串或字符。10. 在连接表达式中,“+”的两个操作数中至少有一个必须是字符串类型。例如,两端不能都是文字串或字符值。11. 务必确保程序语句以分号结束(除了那些在右括号后不需要分号的复合语句)。 第三章 1. 一个非零的整型常量不能以0开始,如果以0开头,那么它就表示一个八进制数(以8 为基)了。2. 密切注意整数的除法。表达式47/100结果为0,即整数商。这是C+程序中输出出错的主要来源之一。3. 当使用运算符/和%时,记住让它们除以0是不合法的。4. 根据优先级的规则仔细检查每个表达式,以确保所有的运算都会以预期的顺序运行。5.

4、 避免将整型和浮点型在一个表达式中混用。如果必须要这样做,考虑使用显性的强制类型转换来减少出错的可能性。6. 对于每一个赋值语句,检查以确认表达式的结果与赋值符号左边的变量具有相同的数据类型。如果不是这样,为了清晰和正确,要考虑使用强制类型转换。并且记住当将一个浮点型数值存储到一个整型变量时会舍去它的小数部分。7. 对于在程序中使用的每一个库函数,要确保用#include命令把相应的头文件包含进来。8. 检查每一个对库函数的调用,以确保参数的数量和参数的数据类型是正确的。9. 对于一个字符串类型,字符在字符串中的位置是从0开始编号的,而不是从1开始。10. 如果程序中的出错原因不明显,离开电脑

5、,研究一下打印的(程序)清单。只有当你完全明白错误来源时,才开始修改你的程序。 第四章 1:输入、输出语句总是以流对象的名字开始,插入运算符和提取运算符指示着数据的去向。语句cout n;是把数据10赋给变量n。2:当一个程序从文件读写时,要确保每一个输入、输出语句都要用文件流的名字,而不是cin或者cout。3:与ifstream 或者ofstream对象相关的open(打开文件)函数要求一个C字符串作为参数。这个参数不能是string对象。对这一点,本教材中规定:这个参数只能是如下两种情况之一:(a)一个文字字符串,或者是(b),由调用函数myString .c_str()返回的字符串,这

6、里的myString是string(字符串)类型。4:当你打开一数据文件作时,应保证打开函数的参数提供的文件名和存放在磁盘上的文件名一致。5:当把字符串读入字符串对象时,提取运算符会在字符尾部第一个空白处停止,但不会消耗掉该字符。6:确保每一个输入语句都能指定了正确数量的变量,并且及每一个变量的数据类型也是正确的。7:如果你的输入数据是混合的(比如字符和数字),务必用插入中间空格的方法来处理。8:回显输入的数据以验证每一个量都在应该的位置上并且有正确的格式。(这是非常重要的,因为在C+里,输入错误既不会产生出错提示信息,也不会终止程序)。第五章 1. C+有三对外形相似、但是效果迥异的操作符:

7、“=”和“=”;“&”和“&”,“|”或和“|”。仔细检查所有的逻辑表达式以确保你正在使用“=”;“&”;“|”运算符。2. 如果为了清晰而使用多余的圆括号,确保左、右圆括号恰好匹配。为了检验圆括号是否恰好配对,从最内层圆括号开始,划线连接它们,对其他的括号也这样做,用这种方式一直处理到最外层的括号。例如:(省略掉了题目)这里有一个快捷方法可以帮你确定左右括号数量是否相等。这个方案使用一个单一数字(不妨称它为“魔法数字”)它的初值为0,从左至右浏览这个表达式,每遇到一个左括号,就将魔法数字加1;每遇到一个右括号,将其减1,在最后的右圆括号上,魔法数字应该为0,例如:(见课本)。3. 不要使用“

8、=”来表示小于或等于,只有这个符号“”对于表示大于或等于是无效的,你必须使用“=”来完成该操作。4. 在一个if语句中,如果then子句或else子句是一个语句序列,记得使用一对花括号,并且要确保不在右花括号后加分号。5. 回显所有的输入数据,通过这样做,你可以知道输入值确实是你预期的值。6. 测试错误的数据,如果一个数据值必须是正的,使用if语句来测试这个值,如果数据是负的或为0,就会输出一个出错信息;否则处理(过程)应该继续运行。例如,下面的代码片段可以检测3个测试分数是否低于0,或是超出100。(代码省略) 这些IF 语句合理数据的界限,只有当数据的值合理时,程序的其余部分才得以执行。7

9、. 采用一些样本值,并且和前面测试BMI程序那样手工测试这些数据。8. 如果你的程序从一个输入文件中读取数据,应该验证文件是否被成功的打开。调用打开函数以后,应该立即用一个if语句来测试该文件流的状态。9. 如果你的程序产生的结果和你动手计算出来的值不相等,请尝试以下建议:a) 重新构造算法;b)再次核对输入数据; c) 仔细检查做计算的那部分代码。如果你对运算的执行顺序存有疑虑,可以插入圆括号,使其清晰。 d) 检查整数的上溢。一个整型变量的值很可能在一次计算中超出了INT_MAX(最大整型值)。当发生这种情形时,一些系统会给出错误信息,但大多数系统不给出。 e)检测分支语句中的条件以保证在

10、所有情况下都选择正确的分支。第六章 1. 仔细计划测试数据以保证程序的所有部分都能被测试到。2. 谨防死循环,在死循环中while语句中的表达式永远不会为假。它的症状是程序不会停止。如果你的系统能够监视程序执行的时间,你可以看到这样一条信息:超过时间限制。 如果已经形成了一个死循环,请检查循环语句的逻辑和语法。确保在while条件表达式的右括号后面没有紧跟一个分号: while(expression); Statement 在大多数情况下正是这个分号引起导致了死循环;编译器认为这个循环体是空语句(这个什么也不做的语句仅由分号构成)。在计数控制循环中,确保循环中的循环控制变量被增加。在标志控制循

11、环中,确保标志最终是被改变的。 一如既往,正如在if语句中一样,在While(当)型语句中要注意区分=与=。 以下的语句行 while(someVar=5) / 出错了,(应该是=) 产生一个死循环。这个赋值(不是关系)表达式的值总是5,这个值被理解为逻辑真。3. 仔细检查循环终止条件,并且确保在循环中的某些事物使它得到满足。密切注意使迭代过多过少的值(即“算错边界综合症” )。4. 在利用检测换行符控制的循环中,记住要使用get函数而不是提取操作符“”。5. 实施算法走查来验证所有合适的前置和后置条件都出现在正确是位置上。6. 用走查代码的方法对循环的执行进行手动跟踪。仔细模拟前面几趟和后面

12、几趟来观察这个循环是怎么真正执行的。7. 如果你的系统提供编译器的话,那就使用它。编译器是这样一个程序,它以慢动作运行你的程序,允许你一次执行一条指令,并且在变量的值改变时观测它的内容。如果你以前没有这样做过,检查你的系统上的编译器是否可用。8. 如果其他所有的都失败了,请用调试输出语句插入到程序中帮助你调试的输出语句。它们输出这样的信息:指出在程序的执行流程或者报告在程序执行到某一点时变量的值。例如,如果你想知道变量beta在程序中特定点的值,你可以插入下面的语句:cout“beta=”betaendl;如果你的输出语句在循环中,你就会得到和循环体中重复次数一样多的beta值。当你调试完你的

13、程序时,你可以移除调试输出语句或者把/放在它们前面以便把它们看为注释(这种做法被称作注释掉部分代码)。如果你需要再次用到这语句,你可以把/移除。9. 一分预防胜似十分的调试。在开始时候,用问题清单正确设计你的循环结构。它看起来是多余的工作,但从长远看你会受益的。10. 谚语: An ounce of prevention is worth a pound of cure. 一分预防胜似十分治疗。第七章 1. 写函数的时候,一定要仔细遵守文档指引(见附录E),随着我们的程序变的越来越复杂,因而也就越来越容易出错,遵守文档和格式标准也就越来越重要。即使函数名似乎可以反映要做的处理,我们还是要用注释

14、语句来描述该过程。使用注释语句说明函数的先决条件(如果有的话)和后置条件,这样可以使函数的接口(或界面)完整。使用注释来说明所有作用不是很清晰的参数和局部变量的目的。2. 在程序顶部为你编写的每一个函数提供一个函数原型。确保这个函数原型与它相应的函数头部是完全一致的(除了在原型中缺少参数名)。3. 记得在函数原型的末尾加个分号。但是在定义函数时,不要在函数名末尾加上分号。因为函数原型与函数名很相像,他们中任意一个出错也很常见。4. 确保对参数列表中的每个参数都给定了类型。5. 使用值参数除非要通过这个参数返回一个结果。地址参数可以改变主调函数的实参的内容;而值参数不能。6. 在参数列表确保每个

15、引用型参数以ampersand(“&”)结尾。如果没有“&”,则为值参数。7. 确保每个函数调用的实参列表在数量和顺序上和形参列表中的数据项匹配,而且对数据类型也要格外仔细。编译程序会捕获实参数量上任何的不匹配,但是对于参数数据类型的不一致,编译器不会显示“编译时出错”的提示信息。特别的,对于一个传值调用,类型不一致会导致隐式的强制类型转换,而不是提示“编译时出错”。8. 记住:与引用参数对应的实参必须是一个变量,然而,与值参数对应的实参可以是任意一个返回该类型值的表达式(除了上面第七点提到的)。9. 当你尝试着去找出错误的根源的时候,要熟悉所有的可以使用的工具,比如走查算法(Algorithm walk-through)、手动跟踪(hand tracing),系统的调试程序,“assert”函数和调试输出语句(Debug output statements)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号