本文为《C Primer Plus》读书笔记。
C与数据
1、常量与变量
在程序运行中没有变化的数据类型,称为常量;在运行中可能被改变或赋值则为变量。
若数据为常量,编译器将通过用户书写的形式来识别类型(如,12为整数,12.00为浮点数)。但是变量则需要在声明时指定其类型。
2、数据类型关键字
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都包含浮点处理器,缩小了速度上的差距。
4、位、字节和字
最小的存储单元是位(bit),可存入0或1,位是计算机内存的基本构建块。
字节(byte)是常用的计算机存储单位。几乎所有的机器,都是1字节8位。这是字节的标准定义,至少在衡量存储单位时是这样。在C语言中,把1字节定义为char类型占用的bit数。
字(word)自然存储单位由若干个字节构成,64位计算机字长为64,32位计算机字长为32,字长越大,数据转移越快。
5、基本数据类型
5.1、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打印。
5.2、其他整数类型
-
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;
5.3 、char类型
char本质上是整数类型。char存储的是整数。计算机使用特定字符集处理编码,如ASCII。char类型被定义为8位的存储单元。
在某些编译器中char被实现为有符号类型,范围-128~127;而无符号则为0~255。查阅相关手册或者查看limits.h头文件。
在char类型处理中文字符时,一般使用数组保存为一段字符串。
5.4、_Bool类型
_Bool类型本质上同样也是整数类型,它只占用一位存储空间,1表示true,0表示false。
5.5、可移植类型: stdint.h和inttypes.h
为避免不同系统下类型名不一致,C99添加了两个新的头文件。确保C语言的数据类型在各系统中的功能相同。
根据不同机器字长,头文件将自动替换不同搞得类型名。如:在32位系统中,int32_t是int别名,在16系统中,int32_t变成long的别名。
一共有三种,精确宽度整数类型,最小宽度整数类型,最快最小宽度类型。
5.6、浮点类型
C标准规定,float类型必须至少能表示6位有效数字,且取值范围至少是 \([10^{-37}, 10^{+37}]\) 通常,系统储存一个浮点数要占用32位。其中8位表示指数的值和符号,剩下24位表示非指数部分(尾数/有校数)及其符号。
double类型至少能表示10位有效数字。
%e %f
浮点数上溢 inf(infinite);
浮点数下溢 0.000000e+00
6、sizeof()
sizeof是C语言的内置运算符,以字节为单位给出指定类型的大小。C99和C11提供%zd转换说明匹配sizeof的返回类型。
7、printf()
printf()语句把输出发送到一个叫做缓冲区(buffer)的中间存储区域,然后缓冲区中的内容再不断被发送到屏幕上,当遇到:缓冲区满,遇到换行字符或者需要输入时刷新缓冲区。返回打印字符个数。
C与字符串
1、字符串简介
在C中字符串都被储存在char类型的数组中,没有专门用于储存字符串的变量类型。
字符数组末尾位置的字符“\0”为空字符,C语言用它标记字符串的结束。C中字符串一定以“\0”结束,这意味着数组的容量必须比待存储字符串中的字符数多1。
字符串与字符的区别
“x”与‘x’
x\0与x
2、scanf()函数
scanf()函数在遇到第一个空白时就不在读取输入。scanf只读取一个单词,而不是一整句。
3、strlen()函数
strlen()函数给出字符串中的字符长度。注意strlen与sizeof的区别。strlen只给出字符的长度(除去‘\0’),sizeof给出整个数组的长度(包括’\0’)。