C 学习笔记

本文为《C Primer Plus》读书笔记。

C 与数据

常量与变量

在程序运行中没有变化的数据类型,称为常量;在运行中可能被改变或赋值则为变量。

若数据为常量,编译器将通过用户书写的形式来识别类型(如,12 为整数,12.00 为浮点数)。但是变量则需要在声明时指定其类型。

数据类型关键字

C 语言基本类型关键字:

K&R C90 C99
int signed _Bool
long void _Complex
short   _Imaginary
unsigned    
char    
float    
double    

int关键字表示基本的整数类型,longshortnsignedsigned则提供基本整数类型的变式,,如:unsigned long int 和 signed short ilnt。

char关键字指定字母与其他字符(#、$、%、*),另外,char类型也可表示较小的整数(ACSII 码)

floatdoubleong double表示浮点数。

_Bool关键字表示布尔类型(false 或 true)。

_Complex_Imaginary分别表示复数和虚数。

3、整数与浮点数类型

按计算机的存储方式可将上面的数据类型分为两大类:整数类型和浮点数类型。

整数存储方式较为简单,如:

int 7

00000111

注意:这里是一个 8 位的字节。

浮点数存储较为复杂,简化理解,如:

float 3.14159

+ .314159 1 | | | 符号 小数 指数

过去浮点运算比整数运算慢,不过现在许多 CPU 都包含浮点处理器,缩小了速度上的差距。

位、字节和字

最小的存储单元是位(bit),可存入 0 或 1,位是计算机内存的基本构建块。

字节(byte)是常用的计算机存储单位。几乎所有的机器,都是 1 字节 8 位。这是字节的标准定义,至少在衡量存储单位时是这样。在 C 语言中,把 1 字节定义为 char 类型占用的 bit 数

字(word)自然存储单位由若干个字节构成,64 位计算机字长为 64,32 位计算机字长为 32,字长越大,数据转移越快。

基本数据类型

int 类型

int 类型占用一个机器字长但是不超过 32 位,16 位机 int16 位,32 位机 int32 位,但是 64 位机 int 依旧是 32 位。因此 int 可代表的数范围为 \([-2^{(32-1)},2^{(32-1)}-1]\)

其中第一位用来表示符号。

C 语言通常假定整型常量为十进制数。但也可使用十六进制或八进制。

0x 或 0X 前缀表示十六进制,使用%#0x 或%#0X 打印。

0 前缀表示八进制,使用%#0 打印。

其他整数类型

  • short int(或简写为 short),占用存储空间可能比 int 类型小。

  • long int(或简写为 long),占用存储空间可能比 int 类型多。

  • long long int(或简写 long long),占用空间可能比 long 多,该类型最少 64 位。

  • unsigned int(或简写 unsigned),用于非负值场景,由于没有符号,表示范围为 \([0,2^{32}]\)

  • C90 添加,unsigned long 、unsigned short。C99 添加,unsigned long long。

  • signed,在任何有符号类型前添加,强调有符号,无特殊意义。

注意:在选择整数数据类型时,需要考虑到在不同位数机器上的可移植性,在此基础上尽量选择 int 类型。

前面提到编译器能够自动识别常量的数据类型,如果用户需要指定特定的类型,可在常量后添加对应的后缀。

  • long 类型,L;不建议使用 l
  • long long 类型,LL;不建议使用 ll
  • unsigned 类型,U 或 u;

打印对应数据类型:

  • long 类型,%l;
  • short 类型,%h;
  • unsigned 类型,%u;

char 类型

char 本质上是整数类型。char 存储的是整数。计算机使用特定字符集处理编码,如 ASCII。char 类型被定义为 8 位的存储单元。

在某些编译器中 char 被实现为有符号类型,范围-128~127;而无符号则为 0~255。查阅相关手册或者查看 limits.h 头文件。

在 char 类型处理中文字符时,一般使用数组保存为一段字符串。

_Bool 类型

_Bool 类型本质上同样也是整数类型,它只占用一位存储空间,1 表示 true,0 表示 false。

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

为避免不同系统下类型名不一致,C99 添加了两个新的头文件。确保 C 语言的数据类型在各系统中的功能相同。

根据不同机器字长,头文件将自动替换不同搞得类型名。如:在 32 位系统中,int32_t 是 int 别名,在 16 系统中,int32_t 变成 long 的别名。

一共有三种,精确宽度整数类型,最小宽度整数类型,最快最小宽度类型。

浮点类型

C 标准规定,float 类型必须至少能表示 6 位有效数字,且取值范围至少是 \([10^{-37}, 10^{+37}]\) 通常,系统储存一个浮点数要占用 32 位。其中 8 位表示指数的值和符号,剩下 24 位表示非指数部分(尾数/有校数)及其符号。

double 类型至少能表示 10 位有效数字。

%e %f

浮点数上溢 inf(infinite);

浮点数下溢 0.000000e+00

sizeof()

sizeof 是 C 语言的内置运算符,以字节为单位给出指定类型的大小。C99 和 C11 提供%zd 转换说明匹配 sizeof 的返回类型。

printf()

printf() 语句把输出发送到一个叫做缓冲区(buffer)的中间存储区域,然后缓冲区中的内容再不断被发送到屏幕上,当遇到:缓冲区满,遇到换行字符或者需要输入时刷新缓冲区。返回打印字符个数。

C 与字符串

字符串简介

在 C 中字符串都被储存在 char 类型的数组中,没有专门用于储存字符串的变量类型。

字符数组末尾位置的字符“\0”为空字符,C 语言用它标记字符串的结束。C 中字符串一定以“\0”结束,这意味着数组的容量必须比待存储字符串中的字符数多 1

字符串与字符的区别

“x”与‘x’

x\0 与 x

scanf() 函数

scanf() 函数在遇到第一个空白时就不在读取输入。scanf 只读取一个单词,而不是一整句。

strlen() 函数

strlen() 函数给出字符串中的字符长度。注意 strlen 与 sizeof 的区别。strlen 只给出字符的长度(除去‘\0’),sizeof 给出整个数组的长度(包括’\0’)。