读书笔记--C陷阱与缺陷(二)】的更多相关文章

第七章 1.null指针并不指向任何对象,所以只用于赋值和比较运算,其他使用目的都是非法的. 误用null指针的后果是未定义的,根据编译器各异. 有的编译器对内存位置0只读,有的可读写. 书中给出了一种判断编译器如何处理内存0的代码: #include <stdio.h> int main() { char *p; p=NULL; printf("location 0 contains: %d\n", *p); ; } 在禁止读内存0的机器上,程序会执行失败.有的机器上,却…
要参与C语言项目,于是作者只好重拾C语言(之前都是C++,还是C++方便). 看到大家都推荐看看  C陷阱与缺陷(C traps and pitfalls),于是好奇的开始了这本书的读书之旅. 决定将书中重要的知识点和易错点记录下来方便自己复习和他人学习~~不多说了,下面开始. 第一章:词法陷阱 在C语言中,符号(程序文字)之间的空白(包括空格符.制表符.换行符)将被忽略.书中举了一例: if (x > big) big = x; 可以写成: if ( x > big ) big = x ;…
第二章 1. 理解函数声明 书中分析了复杂的类型声明方式,也说明了使用typedef声明会更好理解,推荐大家使用typedef进行函数声明. 书中类型分析一层一层挖掘,让读者可以理解多层嵌套的类型含义,有时间的读者可以去看看,笔者不再重复. 既然书中推荐使用typedef进行函数声明,我们就来研究下typedef: typedef主要用于定义一种类型/结构体的别名. 从字面上看和C的宏定义 #define 挺像的,但是define只是简单的参数替换,如果不注意括号很容易产生预期之外的错误. 在指…
第三章 1. 指针与数组 书中强调C中数组注意的两点: 1)     C语言只有一维数组,但是数组元素可以是任何类型对象,是另外一个数组时就产生了二维数组.数组大小是常数(但GCC实现了变长数组..) 2)     一个数组只能做两件事:确定数组大小和获得指向该数组下标为0的元素的指针(数组下标操作其实是指针操作). 如:int a[3]; a除了被用于sizeof的参数时,其他都代表指向数组下标为0的元素的指针. sizeof(a)=3*sizeof(int)  (数组大小) 2. 空指针 常…
第六章 1.预处理器:预处理器先对代码进行必要的转换处理,简化编程者的工作. 它的重要原因有以下两点: a. 假如要将程序中出现的所有实例都加以修改,但希望只改动程序一处数值,重新编译实现. 预处理器可以做到这点,通过将这个数值设为显式常量. b. C语言函数调用花销大,希望有一个程序块看上去像函数确没有函数调用的开销. 2.宏定义的空格不能忽视 宏定义只是简单的文本替换,记住这个本质可以避免很多错误. 如: #define f  (x)  ((x)-1) 上式意思是: f(x)代表((x)-1…
第五章 第五章干货也偏少,但是几个练习题还不错,写出来大家分享下: 1.当一个程序异常终止时,程序输出的最后几行常常会丢失,原因是什么? 我们能够采取怎么样的措施来解决这个问题? 答:因为异常终止的程序可能没机会清空输出缓冲区,程序生存的输出可能位于内存的某个位置,但永远不会被写出. 这种现象会误导程序员以为:程序失败的时刻比实际失败的时刻要早. 解决办法是调试时强制不允许对输出进行缓冲,某种形式如下: setbuf(stdout, (char *)0); 该语句必须在任何输出被写入到stdou…
第四章 1. 连接器 C语言的一个重要思想就是分别编译:若干个源程序可在不同的时候单独进行编译,恰当的时候整合到一起. 连接器一般与C编译器分离,其输入是一组目标模块(编译后的模块)和库文件,输出是一个载入模块(执行文件). 2. 命名冲突与static修饰符 static修饰符可有效减少命名冲突! 如: static int a; 与 int a; 声明含义相同,但是前者限制a的作用域在一个源文件(.c)内,其他源文件是不可见的.但后者都是可见的会产生命名冲突. 如果若干个函数需要共享一组外部…
第5章 原型 5.1 原型属性(所有函数拥有一个prototype属性,默认为空对象) 5.1.1 利用原型添加方法和属性 function Gadget(name,color){ this.name=name; this.color=color; this.whatAreYou=function(){return 'I am a'+this.color+' '+this.name;} } //方案一,对象属性方法追加 Gadget.prototype.price=100;//属性 Gadget…
一.使用ApplicationContext 前面介绍了,我们一般不会使用BeanFactory实例作为Spring容器,而是使用ApplicationContext实例作为容器,它增强了BeanFactory的功能. ApplicationContext允许以声明式方式操作容器,无须手动创建它.在Web应用启动时自动创建ApplicationContext.当然,也可以采用编程方式创建ApplicationContext. 除了提供BeanFactory所支持的全部功能外,Applicatio…
一.使用ApplicationContext 前面介绍了,我们一般不会使用BeanFactory实例作为Spring容器,而是使用ApplicationContext实例作为容器,它增强了BeanFactory的功能. ApplicationContext允许以声明式方式操作容器,无须手动创建它.在Web应用启动时自动创建ApplicationContext.当然,也可以采用编程方式创建ApplicationContext. 除了提供BeanFactory所支持的全部功能外,Applicatio…