《代码大全》,如果还没有看过书中的内容,单听书名,或许你会以为这是一本满是源代码的大块头计算机书籍。当你打开书本,粗略翻看里面的内容之后,你就会觉得书名与书中的内容似乎有些“牛头不对马嘴,风马牛不相及”。的确,此书的原名:《Code Complete》,英语不错的朋友可能一看就会觉得书名的翻译有问题。Code Complete,字面意思:编码完成,怎么也无法与代码大全挂上钩。先别急,再仔细研读书中的内容,你就会明白作者的本意了。本书有一个贯穿全书的重要理念:代码的编写过程其实就是软件构建的过程,代码的好坏直接由软件构件技术来决定。所以,本书主要是围绕软件构建中运用到各种技术展开的,比如:如何做需求,如何做架构,如何写出高质量的代码,如果使用和定义变量,如何做测试等等。这样以来,用《代码大全》作本书书名,似乎也没有什么不妥了。
一直觉得“授人以鱼不如授人以渔”,而本书正是一本“授人以码(代码)不如授人以码(编码)”的计算机书籍。与那些“xxx天速成xx”的书籍相比,本书强调的是方法,思想,而不是具体的实现工具和代码。虽然,菜鸟级别的我,对书中的一些内容暂时还看不太明白,或者说感悟还不是那么深刻,但是,我能够看明白的章节,比如:12章,基本数据类型,看完之后,收获不浅。对其中的一些经验之谈深有同感,比如:“杰出的程序员会修改他们的代码来消除所有的编译器警告,通过编译器警告来发现问题要比你自己找容易得到”,“使用规则有助于减少脑力消耗以及编程失误”。。。。。。
下面就12章基本数据类型,写写自己的学习笔记。
从大一学习C语言,到大二学习C++,数据结构,编程语言中用到数据类型无外乎就是这么几种:
1. 整形
2. 浮点型
3. 字符型
4. 字符串
5. 布尔变量
6. 枚举类型
7. 结构体
8. 类
其中,整形,浮点型,字符型是三种最基本的数据类型。其它所有类型都只不过是其衍生物。具体来说:
l 在实际应用中,整形数是与符号结合起来用的,而且受其可以表示的数值范围大小的限制。因此,整形,又细分为:
1) 无符号短整形: unsigned short int,可简写为:unsigned short;
2) 符号短整形 : signed shortint, 可简写为: shortint;最简单的形式:short;
3) 无符号整形 : unsigned int
4) 符号整形 : signed int ,一般简写为:int。
5) 无符号长整形: unsigned long int;可简写为:unsigned long
6) 符号长整形: signed long int,一般简写为:long。
布尔变量和枚举类型,其实只不过是整形数的衍生物,其本质都是整形数。
l 浮点型,分为:
1) 单精度:float
2) 双精度:double
字符型,可衍生为字符串。
无论是typedef定义的别名,struct定义的结构体,还是class定义的类,其数据单位都是上面这几个基本数据类型。因此,明确了这些基本数据类型的使用规则,可以在编写代码中少犯错误。
规则1:代码中避免使用神秘数值;
神秘数值,即没有明确含义的单纯数字(书上的说法:在程序中出现,没有经过解释的数值文字量)。比如:10,在不同的应用,它可能代表不同的含义:可以是10进制数,可以是10月等等。
规则1的好处:
1) 程序可维护性强,修改起来更容易,而且不易出错。一改全改,不会存在漏网之鱼。
2) 程序可读性好,顾名思义,程序含义显而易见。
规则1的实行方法:使用具名常量,即使用 #define或者 const 定义常量。
比如:
#define PI3.1415926
const float PI=3.1415926;
特例:如果需要,可以使用硬编码的0和1,用于增量、减量和数组的第一个元素下标。比如下面这两种情况是可以接受的:
for month = 1 to NUM_MONTHS_IN YEAR
month= month + 1
规则2:代码考虑除零错误;
代码中使用除法时,一定要注意:分母不能为0的问题。
规则2的实行方法:写防除零代码;
规则3:使用显示地强制类型转换;
如果不显示地进行类型转换,则编译器会自动按照默认方式进行转换,但是不同编译器执行的转换并不相同,容易造成错误。
规则4:避免混合类型的比较;
浮点数,最好不要进行任何比较操作。比如:
floatterm1;
int term2;
对term1,term2进行比较
最好不要写成:if ( term1 < term2)
可以写成: if ( ( term1 – (float)term2) < ACCEPTABLE_DELTA),
其中 ACCEPTABLE_DELTA定义如下: double ACCEPTABLE_DELTA= 0.00001;
规则4:注意编译器的警告信息;
很多程序员都曾被请去帮助别人解决某个讨厌的错误,结果却发现编译器一直都在对这个错误发出警告。杰出的程序员会修改他们的代码来消除所有的编译器警告,通过编译器警告来发现问题要比你自己找容易得多。
规则1:检查整数除法;(区别于整数除零规则)
举例:当使用整数时,7/10不等于0.7,它等于0,或者负无穷大,或者等于最接近的整数。这样一来,10*(7/10)不一定等于(10*7)/10,在整数运算中,前者等于0,后者等于7。解决这类问题的办法:重新安排表达式的顺序,最后执行除法。
规则2:检查整数溢出;
在计算机中,整数的表示是有范围限制的,选择数据类型时要考虑到这个问题。这里值得注意的是,需要考虑的不仅是一个算式的最后值,而且要考虑到中间结果。
解决整数溢出的一种方法:使用长整型或者浮点型。
规则1:避免对数量级相差巨大的数字做加减运算;
32位浮点变量,1000000.00+0.1可能会得到1000000.00,因为32位不能给你足够的有效位数包容1000000和0.1之间的数值区间。
规则2:避免等量判断;
一种有效的方法:先确定可接受的精度范围,然后用布尔函数判断数值是否足够接近。
比如:if ( (term1 – term2) < ACCEPTABLE_DELTA )