文章目录
一、数据类型介绍
C语言提供了丰富的数据类型来描述生活中的各种数据,使用整型类型来描述整数,使用字符类型来描述字符,使用浮点数类型来描述小数
所谓“类型”,就是相似的数据所拥有的共同特征,编译器只有知道了数据的类型,才知道怎么操作数据
下面就来盘点一下C语言提供的各种数据类型,本章节主要探讨内置数据类型。
先来个大致概览图:
字符型
[ ]表示可以省略,下文同理
整型
浮点型
浮点数是我们用来描述小数的
布尔类型
C语言原来并没有为布尔值单独设置一个类型,而是使用整数0表示假,非零值表示真
在C99中也引入了布尔类型,是专门用来表示真假的
_Bool
布尔类型的使用得包含头文件<stdbool.h>
布尔类型变量的取值是:false或者true
#define bool _Bool
#define false 0
#define true 1
代码演示如下:
各种数据类型的长度
每一种数据类型都有自己的长度,使用不同的数据类型,能够创建出长度不同的变量,变量长度的不同,存储的数据范围就有所差异
sizeof操作符
sizeof是一个关键字,也是操作符,专门是用来计算sizeof操作符数的类型长度的,单位是字节
sizeof操作符的操作数可以是类型,也可以是变量或者表达式
sizeof(类型)
sizeof 表达式
sizeof的操作数如果不是类型,是表达式的时候,是可以省略括号的
sizeof后面的表达式是不真实参与运算的,根据表达式的类型计算大小
sizeof的计算结果是size_t(unsigned ×××)类型的,C语言只规定是无符号整数,并没有规定具体的类型,而是留给系统自己去决定,不同的系统中,可能是unsigned int、unsigned long、unsigned long long,对应printf()占位符号是%u, %lu, %llu这显然不利于程序的可移植性
基于此,C语言提供了一个解决方法,创造了一个类型别名size_t,用来统一表示sizeof的返回值类型,打印的时候占位符是%zd
数据类型长度
VS2022,x64环境的输出结果如下:
sizeof的计算结果(返回值)的单位是字节,说到字节,我们来额外加餐一下有关知识
1Byte(字节) = 8bit 1KB = 1024Byte 1MB = 1024KB 1GB = 1024MB 1TB = 1024GB
sizeof中表达式不计算
sizeof在代码进行编译的时候,就根据表达式的类型确定了,类型的常用,而表达式的执行却要在程序运行期间才能执行,在编译期间已经将sizeof处理掉了,所以在运行期间就不会执行表达式了
上述代码中,b是int型,1是int型,但是赋值给s的时候,4个字节的数据赋值给2个字节的数据,会发生截断,如图:
实际上就是,抽象地知道右边是两个int型,赋值过去变成short型,并没有真的计算
二、signed & unsigned
C语言使用signed和unsigned关键字修饰字符型和整型类型
signed关键字,表示一个类型带有正负号,包含负值
unsigned关键字,表示该类型不带有正负号,只能表示零和正整数
对于int类型,默认是带有正负号地,也就是说int等同于signed int
由于是默认,所以其实我们一般不写signed的,当然写了也不会错
signed int a;
// 等同于int a;
int类型有时候也只会表示零和正整数,这时候就可以用无符号修饰
unsigned int a;
unsigned a; // int可省略
另外,特别注意C语言并没有确切规定char类型默认是否带有正负号,这由当前系统决定
这就是说,char不等同于signed char,它有可能是signed char,也有可能是unsigned char
这与int显然不同
三、数据类型的取值范围
上述类型很多,尤其整型类型就有short、int、long、long long四种,这是为什么呢?
其实每一种数据类型都有自己的取值范围,也就是存储的数值的最大值和最小值的区间,有了丰富的类型,我们就可以在适当的场景下去选择适合的类型
如果要查看当前系统上不同数据类型的极限值:
limits.h文件中说明了整型类型的取值范围
float.h文件中说明了浮点型类型的取值范围
而为了代码的可移植性,需要知道某种整数类型的极限值时,应该尽量使用这些常量
四、变量
变量的创建
了解清楚了类型,我们使用类型做什么呢?答案是创建变量
顾名思义,经常变化的值称为变量,反之称为常量
语法形式为data_type name;
int age; // 整型变量
char ch; // 字符变量
double weight; // 浮点型变量
而变量在创建的时候给一个初始值,就叫做初始化,而创建变量的时候初始化,这是一个好习惯
原因在于,局部变量未被初始化的话,其值是随机的,在严格的编译器上还会报错
变量的分类
前文提到局部变量,那什么是局部变量?相对的,什么是全局变量?
全局变量:在大括号外部定义的变量就是全局变量,它的使用范围更广,整个工程中想使用,都是有办法使用的
局部变量:在大括号内部定义的变量就是局部变量,局部变量的使用范围比较局限,只能在自己所在的局部范围内使用的
那如果全局变量于局部变量的名字相同呢?
显然,局部变量优先使用
我们还可以思考,全局变量和局部变量在内存中怎么存储
事实上,我们在学习C/C++语言的时候,我们会关注内存中的三个区域:栈区、堆区、静态区
1.局部变量是放在内存中的栈区
2.全局变量是放在内存中的静态区
3.堆区是用来动态内存管理的(再次预告,这个后期也会重点介绍)
其实,内存区域的划分远比下图更细致,未来有机会的话,我再做介绍
五、算术操作符
写代码的时候,一定会涉及到运算,C语言为了方便运算,提供了一系列的运算符,其中有一组操作符叫做算术操作符,分别是:+ - * / %
+ & -
加减法,有2个操作数,位于操作符两端的就是它们的操作数,这种被叫做双目操作符
* & /
*用来完成乘法,/用来完成除法,而除号的两端如果是整数,执行的是整数除法,得到的结果也是整数
%
运算符%表示取模运算,即返回两个整数相除的余值,这个运算符只能用于整数,不能用于浮点数
dui
对于负数取模,结果的正负号由第一个运算符的正负号决定
六、赋值运算符:= 和 复合赋值
在变量创建的时候给一个初始值叫初始化,在变量创建好后,再给一个值,这叫赋值
int a = 100; // 初始化
a = 200; // 赋值
连续赋值
赋值操作符也可以连续赋值
C语言虽然支持这种赋值,但是写出来的代码不易理解,建议还是拆开来写,方便观察
复合赋值符
在写代码的时候,我们经常可能对一个数进行自增、自减的操作
例如,int a = 10;
a = a + 3;
C语言提供了更为方便的写法:
int a = 10;
a += 3;
C语言中提供了复合赋值符,方便我们编写代码,这些赋值符有:
七、单目操作符
结合前文,单目操作符就是,只有一个操作数的符号
++ 和 –
++是一种自增的操作符,又分为前置++和后置++,–同理
很多初学者在这里容易混淆,请听我道来
前置++,–
口诀就是先+1,后使用
a原来是10,先+1,后a变成了11,再使用就是赋值给b,b得到的也是11,计算结束后,a和b都是11,就相当于如下代码:
后置++,–
同理后置–就类似于后置++,只是把加一换成了减一
口诀就是先使用,后-1
+ & -
就如同数学上的加和减一样
八、强制类型转换
在操作符中还有一种特殊的操作符是强制类型转换
俗话说强扭的瓜不甜,我们使用强制类型转换都是万不得已的时候使用,如果不需要强制转换类型就能实现需求,这样自然是更好的。
总结
本文章介绍了C语言中的数据类型和变量,我觉得这样图文并茂的形式来讲述,还是不错的,请点赞评论收藏支持一下!