C语言数据类型和变量(2)


一、数据类型介绍

  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语言中的数据类型和变量,我觉得这样图文并茂的形式来讲述,还是不错的,请点赞评论收藏支持一下!

  • 13
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值