本文为《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
关键字表示基本的整数类型,long
、short
、nsigned
和signed
则提供基本整数类型的变式,,如:unsigned long int 和 signed short ilnt。
char
关键字指定字母与其他字符(#、$、%、*),另外,char
类型也可表示较小的整数(ACSII 码)。
float
、double
和ong 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’)。