hints
表达式
语句
序列点
左值
字面量
复合字面量
块
作用域
基类型
偏移
伸缩型数组成员
struct hack柔性数组成员
嵌套的匿名成员结构
嵌套联合
记录
字段
链式结构
标记名
类型名
名称空间
char (* flump[3])(int);
加了typedef,变量名就变成类型名
从一个9 位组合100000000 (256 的二进制形式)减去一个负数的位组合,结果是该负值的量
使用| 运算符,任何位与 0 组合,结果都为本身
使用&,任何位与 1 组合都得本身
异或只知道同与不同
预处理器只会替换
记号型字符串 字符型字符串
宏名称和替换体
宏形参
字符串化
记号
#组合 ##粘合
变参宏
__VA_ARGS__
"声明"(Declaration)和"指令"(Statement)
条件编译
预定义标识符
预定义宏
泛型编程
泛型选择表达式
内联函数
宏展开
y = (sqrt) (x);
assert() _Static_assert()
变参宏
可变参函数
parmN
找出正确的数据表示不仅仅是选择一种数据类型,还耍考虑必须进行哪些操作
在C语言中,可以把所需要的操作设计成C函数来表示
算法( algorithm ) ,即操控数据的方法
设计数据类型的过程, 这是一个将算法和数据表示相匹配的过程
抽象数据类型以面向问题而不是面向语言的方式,把解决问题的方法和数据表示结合起来
在开始编写代码之前,需要做很多程序设计方面的决定
头指针
类型特指两类信息:属性和操作
可以认为数学家提供了整数的抽象概念,而C则实现了这一抽象概念
例如在C中,可以提供结构定义和操控该结构的函数原型,这些作用于用户定义类型的函数相当于作用于C基本类型的内置运算符
链表是一个能储存一系列项且可以对其进行所需操作的数据对象。
抽象数据类型(Abstract Data Type) ADT
接口设计应尽量与ADT的描述保持一致
节点(node)
数据隐藏,是一种从编程的更高层次隐藏数据表示细节的艺术
后置条件 postcondition
C语言把所有类型和函数的信息集合成一个软件包的方法是:把类型定义和函数原型(包括前提条件和后置条件注释)放在一个头文件中。该文件应该提供程序员使用该类型所需的所有信息。
在头文件中,把组成函数名的每个单词的首字母大写,以这种方式表明这些函数是接口包的一部分。
list.h (定义数据结构和提供用户接口的原型)、list.c (提供函数代码实现接口)、films3.c (把链表接口应用于特定编程问题的源代码文件)
ADT版本可读性更高,而且针对的是最终的用户所关心的问题。
对大型编程项目而言,这种把实现和最终接口隔离的做法相当有用。这称为数据隐藏,因为对终端用户隐藏了数据表示的细节。
队列是一种"先进先出"(first in, first out, 缩写为FIFO)的数据形式
对链表而言,其大小受限于可用的内存量,因此链表不要太大。(really?)
enqueue(enfiler)
链接
Front/Rear
在重要程序中使用一个新的设计(如,队列包)之前,应该先测试该设计。
驱动程序(driver),其唯一的用途是进行测试
用队列进行模拟
在数组中插入元素,必须移动其他元素腾出空位插入新元素
通过在创建节点时就设置好下一个指针(NULL),可以简化插入操作的逻辑
随机访问( random access ) | 顺序访问( sequential access )
顺序查找( sequential search )
使用并发编程,同时查找列表中的不同部分
二分查找( binary search ), n 次比较能处理有 2n-1 个元素的数组,所以项数越多,越能体现二分查找的优势。
目标项
二叉查找树是-种结合了二分查找策略的链接结构。
根(root)
子树(subtree)
叶节点(leaf)
这种分支特性很适合使用分而制之的递归来处理
二叉查找树只有在满员(或平衡)时效率最高
AVL树
因为要重构,所以创建一个平衡的树所花费的时间更多,但是这样的树可以确保最大化搜索效率。
C已经涵盖了从简单的char类型变量到大型且复杂的结构在内的数据对象。面向对象语言更进一步发展了对象的观点。
对象的性质不仅包括它所储存的信息类型,而且还包括了对其进行的操作类型。
栈是一种LIFO ( 即后进先出last in,first out ) 结构。