阅读书籍:《高质量程序设计指南C/C++语言》林锐、韩勇泉著

说明: 本文档为阅读笔记,要求有一定的C/C++基础,属于提高篇

一、软件质量基本概念

功能属性:

1、正确性Correcteness

软件按照需求正确执行任务的能力,也是精确性;——确定需求的重要性

2、健壮性Robustness

在异常情况下,软件能正常运行的能力;描述需求范围外的行为;

二项内容:容错能力、恢复能力

3、可靠性Reliability

在一定环境,一定时间段内,程序不出现故障的概率;

衡量指标:平均无故障时间(MTTF,mean-timeto fault)

典型事件:千年虫、内存泄露、误差累积等;

非功能性:(能力)

4、性能Performance

指软件的“时间——空间”效率(既要马儿跑得快,又要马儿吃得少);优化数据结构、算法和代码提高;

代表作:《DeltaForce》《古墓丽影》《反恐精英》等

5、易用性Usability

用户使用软件的容易程度。

6、清晰性Clarity

工作成果易读、易理解。

7、安全性Security

防止系统背非法入侵的能力;既属于技术问题又属于管理问题

8、可扩展性Extendibility

反映软件适应“变化”的能力。系统设计阶段重点考虑的质量属性。

9、兼容性Compatibility

两个或两个以上的软件相互交换信息的能力。

兼容性的商业规则;弱者设法与强者兼容,否则无容身之地;强者应当避免被兼容,否则市场将被瓜分。

10、可移植性Portability

软件不经修改或稍加修改就可以运行于不同软硬件环境的能力。

瀑布模型:精髓是“线性顺序”。

          

复用、分而治之、优化折中(折中:协调各个质量属性,达到整体最优,在保证其他质量属性不差的前提下,使某些重要质量属性变得更好。)

技术评审:非正式技术评审ITR,正式技术评审FTR

测试:

测试的常规分类:

阶段:单元测试、集成测试、系统测试、验收测试

方式:白盒测试、黑盒测试

内容:功能测试、健壮性测试、性能测试、用户界面测试、安全性测试、压力测试、可靠性测试、安装/反安装测试……

测试一般流程:

质量保证QA:

修改:

1、找到错误思考修改代码的影响;

2、改错后一定要马上进行回归测试,以免引入新错误;

3、反思与记录心得体会。

标准C语言没有提供I/O的实现,只是定义了标准I/O的函数接口。

首先掌握语言的特征及其使用方法,再学习具体的语言实现才是语言学习的正道!

二、程序入门

1、连接规范:关系到编译器使用什么Name—Mangling方案重命名标识符;

1)对类型、函数、变量或常量

extern“C”……;

2)对一段代码

#ifdef_cplusplus  //or #if _SUPPORT_EXTERN_CPP_

extern"c"{                             //orextern"C++"

#endif

……

#ifdef_cplusplus   //or #if_SUPPORT_EXTERN_CPP_

}

#endif

2、类型转换

1)、隐式转换

一个低级数据类型对象总是优先转换为能够容纳得下它的最大值的、占用空间最少的高级类型对象。一个低级数据类型对象总是优先转换为能够容纳得下                                       它的最大值的、占用空间最少的高级类型对象。

提示:标准C语言允许任何非void类型指针和void类型指针之间进行直接的相互转换。但C++中可以把任何类型的指针直接派给void类型指针,反过来则不                                                   行,除非强制转换;

2)、强制转换

(1)避免值的截断、内存截断或内存扩张;

(2)避免做违反编译器类型安全原则和数据保护原则的事情;

3、标识符

标识符具有属性:值、值的类型、名字、存储类型、作用域范围、连接类型(可见性)、生存期等;

避免使用前导“_”"__"来定义标识符;

4、转义序列

5、运算符

C/C++共有:算术运算符、关系运算符和逻辑运算符等;

C++新提供:新的类型转换运算符、运行时类型识别运算符(typeid)、作用域解析(::)、动态内存分配和释放、类成员指针等;

6、表达式

7、基本控制结构

1)选择(判断)结构

if、if/else(尽量将true的概率高的条件判断至于前面以便提高程序性能)、switch

(1)bool型:尽量和false比较。其它容易出错

(2)整型与零值比较,不能当成bool型;

(3)浮点与零值比较,尽量用“<”和“>”

(4)指针与零值比较,NULL

(5)switch效率比if/else高;

2)循环(重复)结构

do/while、while、for;确定循环(计数控制循环)、不确定循环(标志控制循环)和无限循环(死循环)

1)for

计数器不能是浮点数;不要在遍历(迭代)容器的过程中对容器进行增、删元素操作;计数器从0开始,循环变量取值采用“前闭后开区间”写法,避免                                               差1错误;

2)循环语句效率

对多维数组,正确遍历方法根据语言以什么顺序来安排数组元素的存储空间;

C/C++是以“先行后列”顺序存储,故应以“先行后列”的顺序遍历;

如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面。

三、常量

1、字面常量

2、符号常量

用#define定义的宏常量;用const定义的常量;

const常量可以提高程序的健壮性;

3、契约性常量

4、枚举常量

5、类中的常量

非静态const 数据成员的初始化只能在类的构造函数的初始化列表中进行

定义类的所有对象都共享的常量:枚举常量和static const

6、在C 程序中,const符号常量定义的默认连接类型的是extern的,是外连接,在头文件定义必须加static;

在C++程序中,const符号常量定义的默认连接类型是static,即内连接;

7、字符串常量在头文件中定义并初始化最浪费空间;在头文件中声明所有常量指针常量,而在源文件中定义并初始化它们,则节省内存,不失效率;

阅读页数  95

四、C/C++函数

1、P96 函数前置声明     
                      函数原型(解决函数前置声明的不足)
                              [作用域][函数的连接规范]返回值类型[函数的调用规范]函数名(int a,char *b,...);
                     函数参数传递的本质:用实参初始化形参;
                     函数原型作用之一:指导编译器把实参类型隐式转换为形参类型;
                     函数调用方式:过程调用,嵌套调用,递归调用,回调函数(定时器回调函数和线程函数)
                     函数堆栈主要用途:在进入函数前保存环境变量和返回地址;在进入函数时保存实参的拷贝;在函数体内保存局部变量;
        2、函数调用规范:决定实参压栈、退栈及堆栈释放的方式。
                    1)_cdecl:C/C++函数默认调用规范,参数右—>左依次传递并压入堆栈,由调用函数负责堆栈的清退;
                    2)_stdcall:Win API函数调用规范,参数右—>左依次传递并压入堆栈,由被调用函数负责堆栈的清退;该规范生产函数代码比_cdecl更小;
                    3)_thiscall:C++非静态成员函数的默认调用规范,不能使用个数可变的参数;当调用函数 时this指针直接保存在ECX寄存器中而非压入函数堆栈。其他方面与                                                    _stdcall相同。
                   4)_fastcall:函数的实参将被直接传递到CPU寄存器中而不是内存堆栈中。堆栈清退由被调用函数负责。不能用于成员函数。
                   5)凡接口函数必须显示的指定其调用规范,除非接口函数是类的非静态成员函数。COM接口的方法都指定_stdcall调用规范。
        3、函数的连接规范
              COM接口及其使用的数据类型,是否采用统一的连接规范,对其二进制兼容性和可移植性都没影响;普通的静态连接库(.Lib)和动态连接库(.DLL/.SO)中的全局                       数据类型、全局函数、全局变量或常量,其连接规范必须在两端(库和调用端)保持一致。除非用LoadLibrary()和GetProcAddress()函数对来获得DLL中的函数地址。
       4、参数的传递规则 P102

两种方式:值传递和地址传递
            注意:1)函数无参数写void,不能留空;标准C将空的参数列表解释为可以接受任何类型和个数的参数;标准C++把空的参数列表解释为不可接受任何参数;
                2)参数为指针,仅做输入用,应在类型前加const,防止被无意修改;
                3)如果输入参数以值传递的方式传递对象,则宜改用"const &"方式,因引用的创建和销毁不会调用对象的构造和析构函数,可提高效率;
                4)函数参数个数控制在5个以内;
       5、返回值规则
               1)任何C/C++函数都必须有返回值类型(标准C凡不加类型说明的函数,一律自动案int类型处理;C++则不允许)
               2)函数名字与返回值类型在语义上不可冲突;违反典型getchar();
               3)注意返回对象值和返回引用;
      6、函数内部实现规则
           1)在函数体的“入口处”,对参数的有效性进行检查,检查通过其他途径进入函数体内的变量的有效性;
           2)return语句不可返回指向“堆栈内存”的“指针”或者“引用”;
           3)函数返回值为对象,考虑return语句的效率;P108
          4)函数功能要单一,规模小,控制在50行代码内;
          5)尽量避免函数有“记忆”功能,如static局部变量的使用;
     7、存储类型及作用域规则
1)存储类型
  extern和static用来标识永久生存期限的变量和函数;
  auto和register用来标识临时生存期限的变量;
  默认情况下的存储类型:
全局变量和全局函数是extern的;局部变量是auto;全局常量是static;
局部符号常量是auto的;函数的形参是局部变量,最好不能为static;
另外还有一种存储类型,自由存储(堆存储);
2)作用域规则
标准C语言作用域:文件、函数、程序块和函数原型
C++作用域:比标准C多了类和名字空间。
3)连接类型:外连接、内连接、无连接
插图…………
4)递归函数
A、任何能用递归实现的解决方案都可以用迭代实现;
B、不要使用间接递归
8、使用断言assert(宏)
在函数的入口处,建议使用断言来检查参数的有效性;

高质量程序设计指南C/C++阅读笔记相关推荐

  1. C语言书籍阅读-读书笔记--高质量程序设计指南》--C/C++,林锐

    最近闲下来想找机会参加一些编程比赛锻炼锻炼,可没有一个相关网站可以搜集这些信息,因而自己记录下来: 百度之星,http://star.baidu.com/index/developer.时间07.25 ...

  2. 《高质量程序设计指南——C/C++语言》之开篇记

    <高质量程序设计指南--C/C++语言>是林锐博士和韩永泉先生撰写的著作,记得刚毕业那会读过了.应该说,这本书是对学校教科书的一个很好补充和提高.关于C/C++的经典书籍,国外已经有很多很 ...

  3. 高质量程序设计指南:C++/C语言

    <高质量程序设计指南:C++/C语言> 基本信息 作者: 林锐 韩永泉 [作译者介绍] 出版社:电子工业出版社 ISBN:9787121186172 上架时间:2012-10-24 出版日 ...

  4. 《高质量程序设计指南——C++/C》第三版勘误

    <高质量程序设计指南--C++/C>第三版勘误 1.Page IX:1.5 "关于软件开发..."存在印刷问题: 2.Page 7:倒数第13行,"啰里啰唆& ...

  5. 【转贴】对《高质量程序设计指南--C++/C第二版》的探讨

    <高质量程序设计指南--C++/C(第二版)>的读书心得              作者:fang_rk     写这篇文章是出于一个偶尔的原因:读计算机系的女友即将升入研究生三年级,她说 ...

  6. 《高质量程序设计指南——C/C++语言》第1章 高质量软件开发之道

    第1章 高质量软件开发之道 本书的第1章之高质量软件开发之道,作者用大量的篇幅介绍了"软件质量"的基本概念,解释了软件质量的十大属性.这十大质量属性又分为功能性和非功能性两类,功能 ...

  7. C++ 高质量程序设计指南读书笔记

    第四章 入门 1,全局变量的初始化不要依赖另一个全局变量.因为无法判断顺序. 2,每一个源代码文件就是一个最小的编译单元,每一个编译单元都能独立编译而不需要知道其他编译单元的存在及其编译结果.好处:公 ...

  8. 读书笔记之:高质量程序设计指南——C++/C

    林锐博士的这本书写的非常的好,很多知识点都讲得非常透彻.是学习C++必须看的一本书. 第3章 程序的基本概念 1. 语言中的I/O接口 pic1 2. 语言的实现 pic2,3 3. 程序库 pic4 ...

  9. 高质量程序设计指南附录试题

    附录B :C++/C试题 本试题仅用于考查C++/C程序员的基本编程技能.内容限于C++/C常用语法,不涉及数据结构.算法以及深奥的语法.考试成绩能反映出考生的编程质量以及对C++/C的理解程度,但不 ...

最新文章

  1. Android问题-DelphiXE8安装后编译Android提示SDK无法更新问题(XE10也可以解决)
  2. 从缓冲上看阻塞与非阻塞socket在发送接收上的区别(转载)
  3. IT培训分享:学什么语言不愁找工作?
  4. BZOJ2087 : [Poi2010]Sheep
  5. JS之字符串截取函数substr
  6. 项目vue2.0仿外卖APP(五)
  7. 设置UITableView的separatorInset值为UIEdgeInsetsZero,分隔线不最左端显示的问题
  8. 学python可以做什么职业-Python可以做的5大功能和就职5大高薪职业
  9. 2013-09-16 构建C1000K的服务器(1) – 基础
  10. 软件项目组织与管理期末考试复习要点整理翻译
  11. 全文索引的使用(二)--使用同义词库 (转)
  12. modelsim error:iteration limit reached at time xxx ns.
  13. IP-Guard如何禁止运行U盘程序
  14. C++游戏编程--模拟键盘打字程序
  15. 32位、64位操作系统系统差异对比
  16. 51单片机驱动DS18B20温度传感器测量温度
  17. element ui table的show-overflow-tooltip属性以及设置其宽度
  18. 使用_smu_debug_mode了解undo tablespace
  19. 嵌入式机载软件安全性分析
  20. 【Leetcode】[7]Reverse Integer 反转整数

热门文章

  1. 正态分布 密度函数与分布函数
  2. Ridge和Lasso回归代码实现--Tensorflow部分
  3. 吴恩达深度学习deeplearning.ai——第一门课:神经网络与深度学习——第二节:神经网络基础(上)
  4. [Echarts可视化] 一.入门篇之简单绘制中国地图和贵州地区
  5. 这应该是最全的软件测试工程师必读书籍
  6. linux-patch用法
  7. int类型转成Long类型
  8. vCode组件的使用
  9. Linux 命令行模式下退出 vim
  10. Vue常用的内置指令的底层细节分析