最近一直忘了写,慢慢写吧,书已经读完了。
全书共分17章,这是关于本书第3章内容的博客。本章主要介绍了基本数据类型,本章细节的地方很多,不要太陷进去。博客的目录和书上目录是相似的。此系列博客的代码都在Visual Studio 2022环境下编译运行。
我目前大一刚刚结束,水平有限,博客中若有错误或者总结不到位的地方也请见谅。
目录
3.4.5 可移植类型:stdint.h和inttypes.h
3.4.6 float、double和long double
3.1 示例程序
在编写程序时,如果出现语法错误,编译器会报错,此时无法继续编译。有时,编译器会给出一些警告,警告不会终止编译,警告表明代码有效,但是可能不是程序员想要的。
完成输入后按Enter键表明输入完成。
3.2 变量与常量数据
有些数据在程序使用之前就预设好了,在程序运行过程中不会发生变化,称为常量。有些数据的值在运行过程中会变化,称为变量。
3.3 数据:数据类型关键字
不同的数据类型也有差异,C语言通过基本的数据类型来区分和使用不同的数据类型。如果是常量,编译器通过形式来识别类型。如果是变量,则要在声明时指定类型。
C语言中,关键字int表示基本的整数,long,short,unsigned,signed用于提供基本整数类型的变式。char用于指定字符和较小的整数。float,double和long double表示带小数点的数。_Bool表示布尔值,_Complex表示复数,_Imaginary表示虚数。
C语言的数据类型分为整数类型和浮点数类型。对我们来说整数和浮点数的区别是书写方式不同,对计算机来说是存储方式不同。
位(也称比特)是计算机中最小的存储单元,可以存储0或1,位是计算机内存的基本构件块。
1字节等于8位。字是计算机给定的自然存储单位,计算机每个字包含的位称为字长,字长一般为16,32,64。
3.3.1 整数
整数没有小数部分,在计算机中以二进制补码形式存储。
3.3.2 浮点数
浮点数有小数点,类似于数学的实数。浮点数和整数的存储方式不同。浮点数分开存放小数部分和指数部分。浮点数可以表示的范围比整数大。浮点数通常只是实际值的近似值。
3.4 C语言基本数据类型
3.4.1 int类型
C语言提供了很多整数类型,目的是让程序员根据不同情况选择不同的类型。整数类型一般使用int。
int类型可以是正整数、负整数或0。一般一个int类型数据需要一个字长,与具体系统有关。
声明int变量先写int,再写变量名,最后加分号。声明多个变量时用逗号分隔。
初始化变量就是为变量赋初始值,在声明时完成,直接在变量名后面加上赋值运算符=和需要的值。最好不要把初始化的变量和未初始化的变量放在同一声明中。
可以使用printf()函数输出int类型的值,应使用转换声明%d。%d指明了输出的位置,每个%d与待输出变量列表的int值匹配,可以是常量、变量或表达式的值。转换说明的数量与待输出值的数量应该相同,否则会产生一些错误。
C语言假定整形常量是十进制,也支持八进制和十六进制,0x或0X前缀表示十六进制,0前缀表示八进制。输出不同进制要用不同的转换声明。%d表示十进制,%o表示八进制,%x表示十六进制。如果要显示前缀0、0x和0X,要使用%#o,%#x,%#X。
3.4.2 其他整数类型
C语言提供short,long和unsigned修饰基本整数类型。
short int(或short)占用的存储空间可能比int少,常用于较小数值的场合以节省空间,是有符号类型。
long int(或long)占用的存储空间可能比int多,适用于较大数值的场合,也是有符号类型。long long int(或long long)占用的空间可能比long多,适用于更大数值的场合,至少占64位,也是有符号类型。
unsigned int(或unsigned)类型是无符号类型,只表示非负数。对应有符号类型用于表示正负号的首位用于表示一个二进位,可以表示更大的正整数。
在任何有符号类型前加signed强调有符号。加signed和不加signed的效果是相同的。
声明其他整数类型的方式与声明int相同。
C语言只规定short的存储空间不多于int,long的存储空间不少于int,具体情况由具体机器实现。
要将一个整数视为long类型,可以在末尾加上l(小写L)或L后缀,使用L更好,因为l和1相似。可以使用ll或LL后缀表示long long型。
数值超出相应取值范围会导致溢出,是未定义行为,会输出其他值。
输出unsigned int类型使用%u转换声明,输出long类型使用%ld转换声明。转换声明中要用小写。
输出short类型可以使用%h前缀,h和l前缀都可以和u一起使用表示无符号。
使用错误的转换声明会得到意想不到的结果。
3.4.3 使用字符:char类型
char类型用于存储字符,但实际上存储的是整数。
计算机使用数字编码来处理字符,用特定的整数表示特定的字符,如ASCII码。ASCII码的范围是0-127,因此用一个字节即可表示。char类型足以存储系统的基本字符集。很多字符集超过了127和255,Unicode可以表示世界范围内多种字符集。
C语言的1字节是char类型占用的位数。
char类型变量的声明和其他整数类型相同。
用单引号括起来的单个字符被称为字符常量,可以用于char类型变量的初始化与赋值。编译器会转化为对应的编码值。C语言将字符常量视为int类型。
也可以使用数值对char类型变量赋值,但最好使用字符常量赋值。
有些字符输出不出来,如退格、换行。可以使用对应ASCII码值,也可以用转义序列,用转义序列更好。
转移序列用于表示一些特殊的字符,使用转义序列赋值时必须用单引号括起来。
要注意数字和数字字符的区别。
无论是普通字符还是转义序列,只要是双引号括起来的字符集合,就无需用单引号括起来,双引号中的字符集合叫字符串。
用%c输出待输出的字符。如果用%d输出待输出字符,结果是一个整数。转换说明决定显示方式,而不是存储方式。
编译器的char类型有无符号由具体编译器实现。
3.4.4 _Bool类型
C99标准新增_Bool类型,用于表示布尔值true和false。C语言用1表示true,0表示false。_Bool类型实际也是一种整数类型。
3.4.5 可移植类型:stdint.h和inttypes.h
C99新增了两个头文件stdint.h和inttypes.h确保C语言的类型在各系统的功能相同。
这部分可参考对应头文件,前期用不到。
3.4.6 float、double和long double
C语言的浮点类型有float、double和long double,浮点数包括小数部分,表示范围更大。
表示的精度和范围:long double>=double>float,具体表示与系统有关。现在多使用IEEE 754。
浮点数类型变量的声明与初始化和整型相同。可以使用指数计数法,也可以用一般计数法。可以省略整数部分,也可以省略小数部分,但不能同时省略两者。
在小数后加L或l表示long double型。
C99新增了用十六进制表示浮点常量,加上前缀0x或0X,用p和P代替e和E,用2的幂代替10的幂。
用%f输出一般计数法表示的float和double型变量,用%e输出指数计数法表示的浮点数。输出long double要在前面加L。支持十六进制可用a和A代替e和E。
如果数字过大,超过当前类型能表达范围时,会发生上溢,用printf函数输出会显示inf或infnity等具有无穷含义的内容。
如果所得数字过于接近0,超过了下限,会发生下溢。
浮点数NaN表示未定义或不可表示的值。
3.4.7 复数和虚数类型
C99标准支持复数和虚数类型。
C语言有三种复数类型,float_Complex,double_Complex,long double_Complex。对应实部和虚部都是float,double,long double型。
C语言有三种虚数类型,float_Imaginary,double_Imaginary,long double_Imaginary。
如果包含complex.h头文件,便可用complex代替_Complex,用imaginary代替_Imaginary,用I代替-1的平方根。
3.4.8 其他类型
C语言还有从基本类型衍生的其他类型,如数组、指针、结构等,在后面章节中。
3.4.9 类型大小
sizeof以字节为单位给出指定类型的大小。C99和C11使用%zd转换声明匹配sizeof的返回类型(size_t类型)。
limits.h和float.h头文件有类型限制相关信息。
3.5 使用数据类型
编写程序时,要合理选择所需变量及其类型。要选择有意义的变量名。初始化变量要使用与变量类型相匹配的常数类型。如果把值赋给不同类型的变量,编译器会转化为变量的类型。
C编译器把小数转换为整数时会发生截断,丢弃小数部分,不进行四舍五入。
3.6 参数和陷阱
printf()和scanf()的参数数量是可变的,要确保转换说明的数量、类型与后面参数的数量和类型匹配,否则会出现意外的值。
3.7 转义序列实例
printf()函数把输出发送到缓冲区,然后缓冲区的内容再发送到屏幕上。当缓冲区满,遇到换行字符或需要输入时将缓冲区的内容发送到屏幕上。