C Primer Plus 笔记
文章目录
C Primer Plus 笔记
起步
标准
C89 标准是由 1983 年由 ANSI 起草,于 1989 年被正式接受,它定义了语言和标准 C 程序库。C99 标准是 ISO于 1990 年制定的。ISO 和 ANSI 的标准在本质上是相同的。通常说的 ANSI C 就是指的 ANSI 版本。 C99 标准在 1994 年开始制定,目标是在原有 C90 基础上保持语言小而简单。在三个方面对它进行增强:
- 添加了对国际化字符集的处理。
- 修复明显的不足(如,64 位处理器)
- 数值计算方面的增强(代替 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 提供了多种整数类型
- int 为表示有符号整数。
- short int 或称 short
- long int 或称 long
- long long int 或称 long long (C99),最少为 64 位。
- unsigned int 或称 unsigned 用于非负整数
- unsigned long int 或称 unsigned long。unsigned short int 或称 unsigned short 都来自于 C90 标准。C99 还添加了 unsigned long long int 或称 unsigned long long。
- . 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 位无符号值。
最后,对于一些程序员来说,最大的
文章作者 Jamsa
上次更新 2015-06-29