读书笔记之:C专家编程

摘要:
其原因主要与PDP-11中浮点数字的硬件表示有关。在早期的UNIX程序中,float的使用并不多,因此将操作模式固定为double很方便。它节省了编译器设计者来跟踪其更改。这简化了编译器,并略微改进了C程序的运行时组织。第一个C编译器出现在1970年左右。随着时间的推移,作为其基础的UNIX系统被广泛使用,C语言也蓬勃发展。

第1章 C:穿越时空的迷雾
1.  C语言史前阶段
B 语言通过省略一些特性(如过程嵌套和一些循环结构),对BCPL语言做了 简化,并发扬了"引用数组元素相当于对指针加偏移量的引用"这个想法。B语言同时保持了BCPL语言无类型这个特点,它仅有的操作数就是机器字。 Thomposoon发明了++和--操作符,并把它加入到PDP-7的B编译器中。
2. C语言的早期体验
除了类型系统之外,C语言的许多其他特性是为了方便编译器设计者而建立的。主要包括
(1)数组下标从0而不是从1开始。因为偏移量的概念在编译器设计者的心中已经是根深蒂固。
(2)C语言的基本数据类型直接与底层硬件相对应.例如,不像Fortran,C中不存在内置的复数类型。某种语言要素如果底层硬件没有提供直接的支持,那么编译器设计者就不会在它上面浪费任何精力。C语言一开始并不支持浮点类型,直到硬件系统能够直接支持浮点数之后才增加了对它的支持。
(3)auto关键字显然是摆设。这个关键字只对创建符号表入口的编译器设计者有意义。
(4)表达式中的数组名可以看作是指针。把数组当作指针,简化了很多东西。不再需要一种复杂的机制区分他们,把它们传递到一个函数时不必忍受必须复制所有数组内容的低效率。
(5)float被自动扩展为double。尽 管在ANSI C中的情况不再如此,但最初浮点常量的精度都是double型的,所有表达式中float变量总被自动转换成double。这样做的理由主要与PDP- 11中浮点数的硬件表示方式有关。首先,在PDP-11或VAX中,从float转换到double的代价非常小,只要在后面 增加一个每个位均为0的字即可。如果要转换过去,去掉第二个字就可以了。其次,要知道在某些PDP-11的浮点数硬件表示中有一个运算模式位(mode bit),你可以只进行float的运算,也可以只进行double的运算,但是如果要想在这两种方式之间进行切换,就必须修改这个位来改变运算模式。在 早期 的UNIX程序中,float用的不是很多,所以把运算模式固定为double是比较方便的,省的编译器设计者去跟踪它的变化。
(6)不允许嵌套函数。这简化了编译器,并稍微提高了C程序的运行时组织结构。
(7)register关键字。这个设计是一个失误。如果让编译器在使用各个变量时自动处理寄存器的分配工作,显然比一经声明就把这个类变量在声明期内始终保留在寄存器里要好。使用register关键字,简化了编译器,却把包袱丢给了程序员。
和其他语言不同,C语言有一个漫长的进化过程。在 目前的形式之前,它经历了很多中间状态。它经历多年,从一个实用工具进化为一种经过大量试验和测试的语言。第一个C编译器大约出现在1970。时光荏苒, 作为它的根基的UNIX系统得到了广泛使用,C语言也随之茁壮成长。它对直接由硬件支持的底层操作的强调,带来了极高的效率和移植性,反过来也帮助 UNIX获得了巨大的成功。

第3章 分析C语言中的声明
char *const*(*next)();
next是一个指针,它指向一个函数,该函数返回另一个指针,该指针指向一个类型为char的常量指针。

读书笔记之:C专家编程第1张

第5章 对链接的思考

读书笔记之:C专家编程第2张

第6章 运行时结构

读书笔记之:C专家编程第3张

读书笔记之:C专家编程第4张

读书笔记之:C专家编程第5张

读书笔记之:C专家编程第6张

读书笔记之:C专家编程第7张

 第7章 对内存的思考

读书笔记之:C专家编程第8张

读书笔记之:C专家编程第9张

读书笔记之:C专家编程第10张

读书笔记之:C专家编程第11张

读书笔记之:C专家编程第12张

读书笔记之:C专家编程第13张

读书笔记之:C专家编程第14张

读书笔记之:C专家编程第15张

读书笔记之:C专家编程第16张

读书笔记之:C专家编程第17张

读书笔记之:C专家编程第18张

8为什么程序员无法分清万圣节与圣诞节

读书笔记之:C专家编程第19张读书笔记之:C专家编程第20张读书笔记之:C专家编程第21张读书笔记之:C专家编程第22张读书笔记之:C专家编程第23张读书笔记之:C专家编程第24张

9再论数组

为什么C语言把数组形参当成指针

读书笔记之:C专家编程第25张读书笔记之:C专家编程第26张读书笔记之:C专家编程第27张

多维数组

读书笔记之:C专家编程第28张

 11你会C员,那么C++不在话下

面向对象编程

读书笔记之:C专家编程第29张

抽象

读书笔记之:C专家编程第30张

构造函数

读书笔记之:C专家编程第31张

虚函数与多态

读书笔记之:C专家编程第32张读书笔记之:C专家编程第33张

C++设计目标

读书笔记之:C专家编程第34张读书笔记之:C专家编程第35张读书笔记之:C专家编程第36张

C++与C之间的关系

读书笔记之:C专家编程第37张读书笔记之:C专家编程第38张

附录A

库函数与系统调用

读书笔记之:C专家编程第39张

文件描述符与文件指针

读书笔记之:C专家编程第40张

免责声明:文章转载自《读书笔记之:C专家编程》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇读书笔记之:C与指针读书笔记之:C++Primer 第4版(ch1214)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

请问结构体数组怎样传递参数?

请问结构体数组怎样传递参数? 问结构体数组怎样传递参数? 例如有结构体: struct _pro_ { char m[20]; char *n; }; 定义结构体数组如下: struct _pro_ problem[][] = { {{"",abc},{"",bc...

深度拷贝一个链表

要求: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。返回一个该链表的深度拷贝。 思路: 1、遍历该链表,复制每一个节点,插入到当前节点的后面.形成如下链表.1->1'->2->2'.... 2、将每个拷贝节点的随机指针域,指向原节点(即拷贝节点的上一个节点)的随即指针域指...

C语言基础知识位运算

1.原码,反码,补码: (1)在n位的机器数中,最高位为符号位,该位为零表示为正,为一表示为负;其余n-1位为数值位,各位的值可为零或一。当真值为正时,原码、反码、补码数值位 完全相同;当真值为负时,原码的数值位保持原样,反码的数值位是原码数值位的各位取反,补码则是反码的最低位加一。注意符号位不变。 2.无符号位运算 (1)位运算应用口诀清零取反要用与,某位...

稀疏矩阵

基本介绍 当一个数组里面有大量重复的的元素时,比如0,可以用稀疏矩阵来保存该数组 图解 转换思路 记录数组总共有几行,几列,以及几个不同值 把不同值的行,列,以及值,存入一个规模较小的数组,从而缩小规模 代码,Java实现 定义上图中的二维数组 //定义上图中的二维数组 int[][] arry1 = new int[6][7]; arry1[0][3]...

最常见的Java面试题及答案汇总(二)

容器 18. java 容器都有哪些? 常用容器的图录: 19. Collection 和 Collections 有什么区别? java.util.Collection 是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为...

【C语言程序设计试验与习题指导】试验十三 3 [未完成]

#include <stdio.h>#include <assert.h> #define MAX_N 10 int in_car_num = 0; structcars{ intid; intin_time; }; void come_in_car(int c_id, int c_time, int numb...