C++ Testing and Debugging翻译-20130312_第1页
C++ Testing and Debugging翻译-20130312_第2页
C++ Testing and Debugging翻译-20130312_第3页
C++ Testing and Debugging翻译-20130312_第4页
C++ Testing and Debugging翻译-20130312_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

面向对象程序设计 C 课程系列辅导书 Testing and Debugging 测试和调试 参考译文 信息技术与传播学院 2013 年 3 月 第二章第二章 1 对于任一非 C 保留字的标识符必须要声明 如果你使用了一个未被声明的 标识符 既没有自己用语句声明或也没有包含相应的头文件 你将得到 出错信息 2 如果想试图声明一个和 C 保留字相同的标识符 编译器会给出一条出错信 息 附录 A 列出了 C 的保留字 3 C 语言对大小写敏感 两个大小写不同的标识符会被视为是两个不同的标 识符 而 main 和 C 其它所有的保留字都只是用小写字母 4 为了使用标准库中的标识符 例如 cout 和 string 你必须采用如下方法之 一 或者使用限定的名字 如 std cout 或者在程序的头部附近使用 using 指令 using namespace std 5 检查字符和文字串中不匹配的引号 每个字符的开头和结尾都是撇号 单引 号 而每个文字串是以双引号开头和结尾 6 请确保仅使用单撇号 来包含字符文字 大多键盘上都有个很容易与其 混淆的反向撇号 如果你使用了这个反向撇号 编译器就会给出出错 信息 7 要在文字串中使用双引号 那么在一行中使用这两个符号 如果仅使用 双引号 那么它将结束此串 编译器就会把串的剩余部分视为错误 8 在赋值语句中 确保 左边的标识符是个变量而不是命名常量 9 当把一个数赋值给字符串变量时 右边的表达式必须是个字符串表达 式 文字字符串或字符 10 在连接表达式中 的两个操作数中至少有一个必须是字符串类型 例 如 两端不能都是文字串或字符值 11 务必确保程序语句以分号结束 除了那些在右括号后不需要分号的复合语 句 第三章第三章 1 一个非零的整型常量不能以 0 开始 如果以 0 开头 那么它就表示一个八进 制数 以 8 为基 了 2 密切注意整数的除法 表达式 47 100 结果为 0 即整数商 这是 C 程序中 输出出错的主要来源之一 3 当使用运算符 和 时 记住让它们除以 0 是不合法的 4 根据优先级的规则仔细检查每个表达式 以确保所有的运算都会以预期的顺 序运行 5 避免将整型和浮点型在一个表达式中混用 如果必须要这样做 考虑使用显 性的强制类型转换来减少出错的可能性 6 对于每一个赋值语句 检查以确认表达式的结果与赋值符号左边的变量具有 相同的数据类型 如果不是这样 为了清晰和正确 要考虑使用强制类型 转换 并且记住当将一个浮点型数值存储到一个整型变量时会舍去它的小 数部分 7 对于在程序中使用的每一个库函数 要确保用 include 命令把相应的头文 件包含进来 8 检查每一个对库函数的调用 以确保参数的数量和参数的数据类型是正确的 9 对于一个字符串类型 字符在字符串中的位置是从 0 开始编号的 而不是从 1 开始 10 如果程序中的出错原因不明显 离开电脑 研究一下打印的 程序 清单 只有当你完全明白错误来源时 才开始修改你的程序 第四章第四章 1 输入 输出语句总是以流对象的名字开始 插入运算符和提取运算符指示着 数据的去向 语句 cout n 是把数据 10 赋给变量 n 2 当一个程序从文件读写时 要确保每一个输入 输出语句都要用文件流的名 字 而不是 cin 或者 cout 3 与 ifstream 或者 ofstream 对象相关的 open 打开文件 函数要求一个 C 字 符串作为参数 这个参数不能是 string 对象 对这一点 本教材中规定 这个参数只能是如下两种情况之一 a 一个文字字符串 或者是 b 由调用函数 myString c str 返回的字符串 这里的 myString 是 string 字符串 类型 4 当你打开一数据文件作时 应保证打开函数的参数提供的文件名和存放在磁 盘上的文件名一致 5 当把字符串读入字符串对象时 提取运算符会在字符尾部第一个空白处停止 但不会消耗掉该字符 6 确保每一个输入语句都能指定了正确数量的变量 并且及每一个变量的数据 类型也是正确的 7 如果你的输入数据是混合的 比如字符和数字 务必用插入中间空格的方 法来处理 8 回显输入的数据以验证每一个量都在应该的位置上并且有正确的格式 这 是非常重要的 因为在 C 里 输入错误既不会产生出错提示信息 也不会 终止程序 第五章第五章 1 C 有三对外形相似 但是效果迥异的操作符 和 Statement 在大多数情况下正是这个分号引起导致了死循环 编译器认为这个循 环体是空语句 这个什么也不做的语句仅由分号构成 在计数控制循环中 确保循环中的循环控制变量被增加 在标志控制循环中 确保标志最终是 被改变的 一如既往 正如在 if 语句中一样 在 While 当 型语句中要注意区 分 与 以下的语句行 while someVar 5 出错了 应该是 产生一个死循环 这个赋值 不是关系 表达式的值总是 5 这个值 被理解为逻辑真 3 仔细检查循环终止条件 并且确保在循环中的某些事物使它得到满足 密切 注意使迭代过多过少的值 即 算错边界综合症 4 在利用检测换行符控制的循环中 记住要使用 get 函数而不是提取操作符 5 实施算法走查来验证所有合适的前置和后置条件都出现在正确是位置上 6 用走查代码的方法对循环的执行进行手动跟踪 仔细模拟前面几趟和后面几 趟来观察这个循环是怎么真正执行的 7 如果你的系统提供编译器的话 那就使用它 编译器是这样一个程序 它以 慢动作运行你的程序 允许你一次执行一条指令 并且在变量的值改变时 观测它的内容 如果你以前没有这样做过 检查你的系统上的编译器是否 可用 8 如果其他所有的都失败了 请用调试输出语句 插入到程序中帮助你调试 的输出语句 它们输出这样的信息 指出在程序的执行流程或者报告在程 序执行到某一点时变量的值 例如 如果你想知道变量 beta 在程序中特定点的值 你可以插入下面 的语句 cout beta beta endl 如果你的输出语句在循环中 你就会得到和循环体中重复次数一样多 的 beta 值 当你调试完你的程序时 你可以移除调试输出语句或者把 放在它们 前面以便把它们看为注释 这种做法被称作注释掉部分代码 如果你需要 再次用到这语句 你可以把 移除 9 一分预防胜似十分的调试 在开始时候 用问题清单正确设计你的循环结构 它看起来是多余的工作 但从长远看你会受益的 10 谚语 An ounce of prevention is worth a pound of cure 一分预防胜 似十分治疗 第七章第七章 1 写函数的时候 一定要仔细遵守文档指引 见附录 E 随着我们的程序变 的越来越复杂 因而也就越来越容易出错 遵守文档和格式标准也就越来 越重要 即使函数名似乎可以反映要做的处理 我们还是要用注释语句来 描述该过程 使用注释语句说明函数的先决条件 如果有的话 和后置条 件 这样可以使函数的接口 或界面 完整 使用注释来说明所有作用不 是很清晰的参数和局部变量的目的 2 在程序顶部为你编写的每一个函数提供一个函数原型 确保这个函数原型与 它相应的函数头部是完全一致的 除了在原型中缺少参数名 3 记得在函数原型的末尾加个分号 但是在定义函数时 不要在函数名末尾加 上分号 因为函数原型与函数名很相像 他们中任意一个出错也很常见 4 确保对参数列表中的每个参数都给定了类型 5 使用值参数除非要通过这个参数返回一个结果 地址参数可以改变主调函数 的实参的内容 而值参数不能 6 在参数列表确保每个引用型参数以 ampersand 结尾 如果没有 则为值参数 7 确保每个函数调用的实参列表在数量和顺序上和形参列表中的数据项匹配 而且对数据类型也要格外仔细 编译程序会捕获实参数量上任何的不匹配 但是对于参数数据类型的不一致 编译器不会显示 编译时出错 的提示 信息 特别的 对于一个传值调用 类型不一致会导致隐式的强制类型转 换 而不是提示 编译时出错 8 记住 与引用参数对应的实参必须是一个变量 然而 与值参数对应的实参 可以是任意一个返回该类型值的表达式 除了上面第七点提到的 9 当你尝试着去找出错误的根源的时候 要熟悉所有的可以使用的工具 比如 走查算法 Algorithm walk through 手动跟踪 hand tracing 系统 的调试程序 assert 函数和调试输出语句 Debug output statements 第八章第八章 1 确保用作函数实际参数的变量在函数调用的块内被声明 2 仔细地定义前置条件 后置条件和参数列表来消除副作用 仅用在一个函数 中使用的变量应该声明为局部变量 在你的程序中不要使用全局变量 特 例 允许把 cin 和 cout 作为全局变量引用 3 如果编译器显示一个如 未被声明的标识符 信息 检查这个标识符没有出 现拼写错误 即 实际上声明过了 吗 该标识符是在引用之前声明的吗 该标识符的作用域包括了对它的引用吗 4 如果你试图使用一个与非局部变量同名的局部变量 局部声明中的拼写错误 将造成严重破坏 C 编译器不会解释 但将会导致每个对局部变量的引用 被非局部变量代替 5 记住 相同的标识符不能既用在参数列表中又用在函数最外部的局部变量声 明中 6 对于有返回值的函数 确保函数头部和函数原型以函数返回值的正确类型开 始 7 对于有返回值的函数 不要忘记使用 return Expression 返回 表达式 语句来返回函数值 确保表达式是正确的类型 否则会发生隐含强制类型 转换 8 记住对一个有返回值函数的调用总是作为表达式的一部分 然而对一个返回 类型为空的函数调用总是作为一个独立的语句 然而 C 淡化了这个差 别 允许你想调用一个空函数一样去调用一个有返回值的函数 从而忽略 了返回值 小心这里 9 通常 在有返回值函数的参数列表中不要使用引用参数 然而 当一个输入 输出流对象作为一个参数被传递时 必须使用引用参数 10 如果必要的话 应用系统的调试器 或是用调试输出语句 来显示一个函 数何时被调用并且是否正确运行 在调用函数之前和调用之后能立刻显示 实际参数的值 分别显示输入值和输出的值 你也可能想要显示函数里局 部变量的值 以显示每次调用时会发生什么 第九章第九章 1 在 switch 语句中 确保每个 case 分支之后都有一个 break 语句 否则 流 程控制转移到下一个 case 语句继续执行 2 在 switch 语句中的 case 是由确定的值 而不是变量构成 然而 他们可能 是包含命名常量或仅包含常量的表达式 3 一个 switch 语句中的表达式不能是浮点型或字符串类型 并且 case 中的常 量也不能是浮点型或字符串常量 4 若有可能 switch 表达式中的值不和 case 常量中的任一语句相匹配 应该提 供一个 default 选项 实际上 总是包含一个 default 语句是一种好的习 惯 5 仔细检查较长的 switch 语句 确保没有遗漏任何分支 或情况 6 do while 循环是一个后验型循环 先执行后判断 若存在跳过整个循环体 的情况 请使用 while 语句和 For 语句 7 for 语句的第一行的括号内通常包含三部分 大多数情况下 第一部分初始 化循环控制变量 第二部分测试循环控制变量 第三部分使变量自增或自 减 这三部分必须使用分号隔开 任何部分可能会被省略 但分号必须存 在 8 在嵌套控制结构中 break 语句只能跳出嵌套结构的一级 包含 break 语 句的最内层 switch 或 loop 结构 第十章第十章 1 在表达式中避免不必要的副作用 比如下面的测试 if x y z 就不够清晰 而且与下面的表达式序列相比更易于出错 x y if y z 另外 如果意外地漏掉了包围赋值运算的括号 比如 if x y z 那么根据 c 运算符的优先级 x 不能被赋予 y 的值 它将被赋予 0 或 1 强制类型转换后的关系表达式 y 操作符和 get 函数会自动的添加空字符 如果你 单独地向字符串中存入字符或以任何方式操作数组 一定要考虑空字符 3 记住在 C 中 C 字符串的初始化与 C 字符串的赋值是不同的 初始化是被 允许的 但赋值是不允许的 4 集合的输入或输出是被允许的 但不能用于其他类型的数组 5 如果你使用 操作符向 C 字符串变量输入数据 一定确保数组足够大 以容 纳下空字符和输入流中最长序列的字符 6 对于 C 字符串中的输入 操作符停止在尾部第一个空字符处 但空字符不 被使用 同样地 如果 get 函数因为碰到换行符而提前停止读入 这个换 行符也不被使用 7 当你使用 strcpy 库函数时 确保目标数组至少与正在被复制的数组一样大 8 一般目的的函数 例如 ADT 运算 应该在特定的程序之外被检测 通过使用测 试主调函数 9 仔细的选择测试数据 以便能检验到所有结束的情况 并且有些是在中间结 束的 结束条件是那些达到存储它们的结构的限度的条件 例如 在一个 列表中 应该有测试数据 包括由 0 和 1 构成的数字和最大长度 还有 1 和最大长度之间的数字 第十四章第十四章 1 回顾第 11 章的测试和调试的提示 它们应用于 c 类的设计与测试 它们均 是面向对象程序设计的核心 2 当使用继承 当声明继承类不要忘了包含全局变量 Class derivedclass public baseclass 全局函数让基类型成为继承类的一个全局基类型 也就是说 继承类的客户端可 以对一个继承类对象使用全局基类型操作 除构造函数 3 包含一个继承类声明的头文件必须 include 包含基类型声明的头文件 4 尽管一个继承类继承它基类型的局部和全局变量 它不能直接访问被继承的 局部变量 5 如果一个基类有一个构造函数 继承类的构造函数的主体在被调用之前执行 如果基类构造函数需要参数 你必须通过构造函数初始化器使用这些参数 Derivedclass Derivedclass Baseclass arg1 arg2 如果你不包括一个构造函数初始化器 其基类的默认构造函数被调用 6 如果类有一个成员 是另一个类的对象的构造函数和这个成员对象需要的参 数 你必须通过构造函数初始化器使用这些参数 SomeClass SomeClass memberobject arg1 arg2 如果没有构造函数初始化器 成员对象的默认构造函数被调用 7 获得动态绑定对象的类对象作为参数传递 你必须 通过对象为参考 而不是数值 在基类型声明中将操作声明为虚拟的 8 如果一个基类声明了一个虚函数 即使函数体为空它也必须要执行 9 导出类型不能重新定义函数返回值类型的一个虚函数 第十五章第十五章 1 要确保有一个基本的结束递归调用情况 如果没有相应的情况下 算法继续 发出递归调用 直到所有的存储数据都被使用 每次函数被调用 递归调 用或任何非递归调用 栈的空间是自动的参数和局部变量分配空间 如果 没有相

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论