C Primer Plus 笔记

起步

标准

C89 标准是由 1983 年由 ANSI 起草,于 1989 年被正式接受,它定义了语言和标准 C 程序库。C99 标准是 ISO于 1990 年制定的。ISO 和 ANSI 的标准在本质上是相同的。通常说的 ANSI C 就是指的 ANSI 版本。 C99 标准在 1994 年开始制定,目标是在原有 C90 基础上保持语言小而简单。在三个方面对它进行增强:

  1. 添加了对国际化字符集的处理。
  2. 修复明显的不足(如,64 位处理器)
  3. 数值计算方面的增强(代替 FORTRAN ) C11 标准是在 2007 年提出的,最初叫 C1X。在 C11 中标准委员会考虑到 C99 并未像 C90 那样广泛会厂商支持,因此 C99 中的一些内容在 C11 中变成了可选功能。

编程

C 实现将编写过程分为编译和链接两步。编译器将代码转换为中间代码,链接器将它与其它代码组合成执行文件。C 使用这两部分来实现程序的模块化。

介绍

关于函数申明

C90 标准中中添加了原型,旧编译器可能不识别。原型申明对于编译器来说是个特殊的函数,称为函数申明。它需要指定函数的所有属性。 旧的 C 在函数申明时有更多的限制,只能指定返回值,不能说明参数。C90,C99 和 C11 编译器能识别这一写法但会指出不要再使用它。 C 标准推荐提供所有函数的原型。

程序状态

简单来说就是在程序某个时间点上所有变量的值的集合。它是当前计算状态的快照

关键字

C99 增加的关键字: signed, const, enum, volatile C11 增加的关键字: inline, _Alignas, _Alignof, _Bool, _Complex, _Generic, _Imaginary, _Noreturn, _Static_Assert, #_Thread_local

C 中的数据

数据类型

bit, Byte, Word 中 byte 通常是计算机的内存单元。word 是特定计算机平台上内存的自然单位。比如 16 位机器,就是 word 为 16 位。

浮点数与数学上的实数对应。在机器中表示为分数和它的指数两部分。因此对浮点数进行某些数学操作时(如减去一个较大的数)会丢失精度。浮点数不可能表示所有的数字,因此它会取近似值。比如将 7.0 存储为 6.99999。浮点操作也比整数操作慢。

基础类型

整数类型

C 提供了多种整数类型

  1. int 为表示有符号整数。
  2. short int 或称 short
  3. long int 或称 long
  4. long long int 或称 long long (C99),最少为 64 位。
  5. unsigned int 或称 unsigned 用于非负整数
  6. unsigned long int 或称 unsigned long。unsigned short int 或称 unsigned short 都来自于 C90 标准。C99 还添加了 unsigned long long int 或称 unsigned long long。
  7. . signed 关键字可以显式的用于前面的那些类型。

这么多的整数类型,C 只保证 short 不会比 int 长,long 不会比 int 短。对于当前的 PC,通常认为 long long 为 64 位,long 为 32 位,short 为 16 位,int 为 16 或 32位,这依赖于具体的机器的 word 长度。 在 printf 中使用 %u打印 unsigned int,%hd%打印 long,%ld打印 long long。

字符型

char 用于存储字符,但在技术上来说存的是整数。用数字来描述某个字符。标准 ASCII 代码用 0 至 127 表示。这个范围用 7 位就够了,char 类型通常定义为一个内存单元大小(8-bit)。很多字符集用 127 或 255 不够表示。Unicode 可以描述超过 110000 个字符。ISO/IEC 开发的 10646 与 unicode 字符集兼容。 C 将 byte 定义为 char 使用的 bit 数量,因此有 16-bit 或 32-bit 的 char 类型。

Signed 和 Unsigned char,分别用 -128 至 127 或 0 至 255 表示 char,需要查看编译器手册或检查 limits.h 来了解你的编译器所使用的类型。C90 标准中允许使用 signed char 或 unsigned char。

_Bool 型

C99 中添加的类型,可以为 true 或 false。由于 C 中使用 1 作为 true,0 作为 false,因此 _Bool 类型实际上只是整型。

可移植类型:stdint.h 和 inttypes.h

C 提供了非常多的整数类型。同一个名称在不同平台上可能代表的含义不同。C99 中为不同平台的名称定义了统一的含义,定义在 stdint.h 中。比如,int32_t 表示 32 位有符号整数。 为避免某些平台不支持明确的整数宽度(比如指定为 32 位),C99 和 C11 提供了另一种类型的名称。这套名称保证提供的满足需要的最小类型,这些类型被称为最小宽度类型。比如,int_least8_t能提供保存 8 位整数的类型。如果在 16 位系统上,int8_t类型可能没有定义。但是,int_least8_t类型将是可用的,有可能它会使用一个 16 位的整数。 有些程序员可能会更关心速度而不是空间。对他们来说,C99 和 C11 中定义了鼍一套用于快速计算的类型。这些类型被称为快速最小宽度类型。比如int_fast8_t定义了用于代替整数的提供最快计算速度的的 8 位无符号值。 最后,对于一些程序员来说,最大的