本章主要讲述C语言的变量常量和数据类型
在C语言中,每个变量都有特定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上,常量可被改变也可被赋值。当你创建一个变量时,编译器会在内存中利用声明的数据类型来分配不同的空间,不同的数据类型决定了变量占用不同的内存,以及该类型的变量所能存储的最大值和最小值。
在C语言中,数据类型主要分为两大类:整数类型和浮点类型。数据类型的设计,让人们可以根据不同的情况选择不同的类型。
整数类型如下:
数据类型 | 存储字节大小(Windows) | 存储字节大小(Linux) | 值范围 |
---|---|---|---|
char | 1 | 1 | -128 到 127 或 0 到 255 |
short | 2 | 2 | -32,768 到 32,767 |
int | 4 | 4 | -2,147,483,648 到 2,147,483,647 |
long | 4 | 8 | -2,147,483,648 到 2,147,483,647 |
浮点类型如下:
数据类型 | 存储字节大小(Windows) | 存储字节大小(Linux) | 值范围 | 精度 |
---|---|---|---|---|
float | 4 | 4 | 1.2E-38 到 3.4E+38 | 6位有效位 |
double | 8 | 8 | 2.3E-308 到 1.7E+308 | 15位有效位 |
long double | 8 | 16 | 3.4E-4932 到 1.1E+4932 | 19位有效位 |
以float类型为例,为了打印浮点类型变量,可使用%f来处理浮点值。若要控制精度,可使用%.2f来输出仅显示两位小数的浮点数,其它同理。
关于定义变量:
下面来分析各个类型:
int类型表示基本的整数类型,不显示小数部分,而long和short也可以表示整数,平时大多数情况使用int型,根据特定需求也可以选择其它类型。
char类型也是个整数类型,也可用于指定字母和字符,其中字母字符以数字编码存储(如ASCII),char类型赋值时,需使用单引号括起,如char apple = 'A',此单引号内的字符被称为字符常量。
浮点类型可表示实数,范围比整型更大。一个数小数点后面有数字,该数就是一个浮点值,其中float为单精度浮点值(1位符号,8位指数,23位小数),double为双精度浮点值(1位符号,11位指数,52位小数),若数值过大,可使用指数计数法(e计数法)表示。
在C语言中,void类型是一种特殊的数据类型,被称为无类型,此类型用于函数没有返回值。
在C99标准中,提供了_Bool 型,也就是布尔类型,可表示布尔逻辑值(true或false),其中true为1,false为0。
在C99标准中,还新增了复数类型_Complex和虚数类型_Imaginary,其下面也分float、long、double类型,复数的实部类型和虚部类型都基于实浮点类型来构成。
注意:
1.浮点数并不是所有数据类型最适合的解决方案,对于例如两个很大数之间的数学运算,浮点数损失的精度更多,因为浮点数浮点数通常存储实际值的近似值。
2.整数类型前也可加入附属关键字unsigned,表示无符号整型,由于其表示正负号的第一位现在用于表示数字位,所以可表达更大的数。而signed关键字仅强调有符号类型的意图。
3.若将一个较小的常量作为long类型可在其末尾加上小写l或大写L,long long类型同理,使用ll或者LL,unsigned long long可使用ull、LLU、Ull,float类型可使用f或F。
4.若使用超过数据类型的最大值,其数值会从0开始重新计算,即整数溢出行为。
5.unsigned类型使用%u转换说明,long类型使用%ld转换说明,short类型使用%h,unsigned long类型使用%lu,long long类型使用%lld,unsigned long long类型使用%llu,而char类型使用%c,float和double类型用%f,使用指数计数法,则使用%e。
6.浮点数若使用当前数据类型能表示的最大范围值,进行某些运算过程时,可能会丢失部分精度。
7.如果用双引号括起的字符集合(字符串),无需用单引号括起普通字符和转义序列。
8.如果需要在一个源文件中引用另外一个源文件中定义的变量,需在引用的变量声明前加上 extern 关键字,例如extern int a,其算作声明而不是定义,因为在一个程序中,变量只能定义一次,但可以声明多次。
9.数据类型强制转换,用(类型说明符)(表达式)方式表示,例如b=(int)(x+y)。
在C语言中,还有一类值,在程序执行期间不会改变,这些被称为常量。常量即常规的变量,只不过常量的值在定义后不能进行修改,由各类基本数据类型组成。
定义常量,可使用#define预处理器,被称作宏定义,此方式定义的是不带类型的常数,只进行简单的字符替换,这种方式可称为明示常量。若在定义变量时加上const关键字前缀,可实现定义不允许改变数值的常变量,仅作只读作用,此种方式包含数据类型。
//宏定义示例
#define PI 3.14 //一般情况下,符号常量名使用大写表示
对编译器来说,它可通过直观表现来判断其类型,例如42被识别为整型,而42.420被识别为浮点型
转义序列也是一类字符常量,可参考下表:
转义序列 | 含义 |
---|---|
\\ | \ 字符 |
\' | ' 字符 |
\" | " 字符 |
\? | ? 字符 |
\a | 警报 |
\b | 退格键 |
\f | 换页符 |
\n | 换行符 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ooo | 一到三位的八进制数 |
\xhh | 一个或多个数字的十六进制数 |