C专家编程(笔记).pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《C专家编程(笔记).pdf》由会员分享,可在线阅读,更多相关《C专家编程(笔记).pdf(6页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第一章:一:尽量不要在你的代码中使用无符号类型,以免增加不必要的复杂性,尤其是不要仅仅因为无符号数不存在负值(如年龄,国债)而用它来表示数量。只有在使用位段和二进制掩码时,才可以使用无符号数,应该在表达式中使用强制类型转换,使操作数均为有符号数或无符号数。这样就不必由编译器来选择结果的类型。二:当执行算术运算时:操作数的类型如果不同,就会发生转换,数据类型一般朝着浮点精度更高,长度更长的方向转变。整型数如果转换为 signed 不会丢失信息,就转换为 signed,否则转换为 unsigned。一个L的NUL用于结束一个字符串。ASCALL字符中零的位模式被称为NUL。两个的 NULL 用于表
2、示什么也不指向,(空指针)第二章:这不是 BUG,而是语言特性2.1 多做之过:这些特性包括容易出错的 switch 语句,相邻字符串常量的自动连接和缺省全局范围。C 语言中,几乎从来不进行运行时错误检查-对进行解除引用操作的指针有效性检查大概是唯一的例外。无效的指针可能成为程序员的噩梦,人们很容易用一个无效的指针来引用内存。在所有的虚拟内存体系结构里,一旦一个指针进行解除引用操作时,所引用的内存超出内存地址的虚拟地址空间,操作系统就会结束这个进程。但是DOS 并不支持虚拟内存,即使内存访问失败,它也无法立即捕获这种情况。C 语言的理念,程序员应该知道自己正在干什么,而且保证自己的所做所为是正
3、确的。各个 case 和 default 的顺序是可以任意的,但习惯总是把 default 放在最后。switch 存在的一些问题是,其中之一是它对 case 可能出现的值太过放纵了,例如可以在 switch 的做好括号后声明一些变量,从而进行一些局部存储的分配,在最初的编译器中,这是一个技巧-绝大多数用于处理复杂复合语句的代码都可以被复用。switch 语句缺省采用”fall through“,在 97%的情况下都是错误的。break 语句事实上跳出的是最近的那层循环语句或 switch 语句。字符串常量的自动合并意味着字符串数组在初始化时,如果不小心漏掉了一个逗号,编译器不会发出错误信息,
4、而是悄无声息的合并在一起。在最后一个字符串末尾的逗号并不是打错字,而是从早期的 C 语法中继承下的东西,不管存在是否有意义,ANSI对它的解释是是语言自动生成容易些。太多的缺省可见性定义函数时,在缺省情况下名字是全局可见的,可以再名字前面加一个冗余的 extern 关键字,也可以不加,效果一样的。如果想限制这个函数的访问,就必须加个 static 关键字。2.2 误做之过:C 语言中属于“误做之过”的特性,就是语言中有误导性质或是不适当的特性,这些特性有些跟 C 语言的简介有关,有些则更操作符的优先级有关。C 语言存在的一个问题就是它太简洁了,仅增加,修改或删除一个字符就会使程序成另外一个仍然
5、有效却全然不同的程序。更糟糕的是,许多符号是被”重载的“在不同的上下文环境有不同的意思。当 sizeof 的操作数是个类型名时,两边必须加上括号(这常常使人认为他是一个函数),但操作数如果是一个变量则不必加括号。你让一个符号所表达的意思越多,编译器就越难检测到这个符号在你的使用中所存在的异常情况。2.3 少做之过属于少做之过的特性就是语言应该提供但未提供的特性。C 语言有最大一口策略,这种策略表示如果下个标记有超过一种的解释方案,编译器将选取最长的字符序列方案。第三章 声明参数按照从右到左的次序压倒堆栈中,这种说法过于简单了,参数在传递时首先尽可能地存放到寄存器中(追求速度)。一个 int 型
6、变量跟只包含一个 Int 型成员的结构变量 S 在参数传递时可能完全不同,一个 int型参数一般会被传递到寄存器中,而结构变量 s 在参数则很可能被传递到堆栈中。结构体:在结构中放置数组,如 struct s_tagint a100;现在可以把数组当做第一等级的类型,用赋值语句拷贝整个数组,一传值的方式传递到函数,或者把它作为函数的返回类型。在典型的情况下并不需要频繁的对整个数组进行赋值操作。但是如果需要这样做,可以通过放入结构中实现。C 语言声明的优先级A 声明从它的名字开始读取,然后按照优先级一次读取。B 优先级从高到低一次是:1 声明中被括号括起来的2 后缀符号()【】3 前缀符号*不要
7、在一个 typedef 中放入几个声明器,千万不要把 typedef 嵌到声明的中间部分。不要为了方便起见对结构使用 typedef,这样做唯一的好处是能使你不必书写 struct 关键字,但这个关键字可以向你提示一些信息,你不应该把它省掉。typedef int x10,#define x int10的区别正确思考这个问题的方法是把 typedef 看成是一种彻底的“封装”类型-在声明它之后不能再往里面增加别的东西。它和宏的区别体现在两个方面。首先,可以用其他类型说明符对宏类型进行扩展,但对 typedef 所定义的类型名却不能这样做。如下所示:#define peach intunsign
8、ed peach i;/没问题typedef int peachunsigned peach i;/错误非法。其次:在连续几个变量的声明中,用 typedef 定义的类型能够保证声明中所有的变量均为同一种类型,而用#define 定义的类型则无法保证。extern 对象声明告诉编译器对戏那个的类型和名字,对象的内存分配在别处进行。由于并未在声明中为数组分配内存,所以并不需要提供关于数组长度的信息。并且 extern int*i;extern int i;是不一样的。第四章 数组和指针出现在赋值符号左边的符号有时被称为左值(由于它位于“左手边”或“表示地点”),出现在赋值符号右边的符号有时则被称
9、为右值,编译器为每个变量分配一个地址(左值),这个地址在编译时可知,而且该变量在运行时一直保存于这个地址,相反存储于该变量中的值只有在运行时才可知。如果需要用到变量中存储的值,编译器发出指令从指定地址读入变量的值,并将它存于寄存器。char*p=abcdef;char p=abcdef;前者编译器告知 p 是一个纸箱字符的指针(相反数组的定义告诉编译器 p 是一个字符序列)pi表示从 p 所指向的地址开始,前进一步,每步都是一个字符,既然把 p 声明为指针,那么不管 p 原先是定义为指针还是数组,都会按照上面所示的三个步骤进行操作;。前者间接访问数据,首先取得指针的内容,把它作为地址,然后从这
10、个地址提取数据。如果指针有一个小标1就把指针的内容更加上一作为地址,从中去数据后者 直接访问数据,a1指示简单地一 a+1 为地址取数据。第五章;链接器收集模块准备执行的三个阶段的规范名称是连接-编辑,载入,动态链接。如果函数库的一份拷贝时可执行文件的物理组成部分,那么我们称之为静态链接;如果可执行文件只是包含了文件名,让载入器在运行时能够寻找程序所需要的库函数,那么我们称之为动态链接。静态链接的模块被连接编辑并载入运行,动态链接的模块被连接编辑后载入,并在运行时进行连接以便运行。程序执行时,在 main()函数被调用前,运行时载入器把共享的数据对象载然入到进程的地址空间。外部函数被真正调用之
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 专家 编程 笔记
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内