文章目录
一、数据类型介绍
C语言为了描述世界里丰富的数据提供了许多种的数据类型,现在我们来详细介绍一下
- 整型:存放整数数据,在C语言中用int表示,代码演示:
int main()
{
int a =0;//将变量a定义为整型,接受整数数据
return 0;
}
- 长整型:long 或者long int,与整形同理,只是所占空间不同
- 更长的整型:long 或者long long ,也与整型同理,只是所占空间不同
- 字符型:存放字符型的数据,在C语言中用char表示,C语言中字符型数据用单引号括起,代码演示:
int main()
{
char ch ='a';//将变量ch定义为字符型,接受字符数据
return 0;
}
- 单精度浮点型:浮点型就是小数类型,用来存放小数,在C语言表示为float,代码演示:
int main()
{
char sh = 3.14;//将变量sh定义为单精度浮点型,接受小数数据
return 0;
}
- 双精度浮点型:比单精度浮点型精度更高,也是存放小数,在C语言表示为double,还有long double,与定义单精度浮点型同理
- 布尔类型:用于表示逻辑值真(true)或者假(false)的数据类型,在C语言中0表示假,非0为真,默认情况下0为假,1为真,但是并不是真就是1,非零才是真,1只是真的默认值,在C语言中布尔类型用_Bool或者bool定义,代码演示:
#include <stdbool.h>
int main()
{
bool a = ture;//或者_Bool a = true;将变量a定义为布尔型,存放逻辑值真或假
return 0;
}
注意:使用布尔型数据要包含头文件<stdbool.h>
二、signed和unsigned
- signed:
(1)signed可以修饰短整型,整型,长整型,更长的整型,字符型等数据类型,含义为有符号的,signed int就是一个有符号的整型,既可以表示正数,也可以表示负数
(2)在C语言中int默认就是signed int,任意一种写法都是正确的,都可以保存正负数
(3)C语言规定,char类型可能是signed char 也有可能unsigned char,具体由当前系统决定,与int不同,int就是signed int - unsigned:unsigned也是修饰短整型,整型,长整型,更长的整型,字符型等数据类型,含义为无符号的,无符号数只能表示0和正整数,不能表示负数
- signed和unsigned的区别:signed的好处是既可以表示正数又可以表示负数,而unsigned的好处是,在相同类型的情况下使用它,那么该数据类型可以表示的正整数的大小是signed的两倍,比如signed char范围为 -128 到127,unsigned char范围为0 到255,如果现在不懂数据类型的取值范围也没事,只要知道区别就行,我们马上介绍数据类型占用的空间和它的取值范围
三、数据类型占用的空间
每个数据类型所占用的空间:我们需要使用操作符sizeof,它可以用来计算数据类型所占用的空间,其格式为sizeof (类型),sizeof 表达式,比如:
以上三种写法都可以,虽然变量名和表达式可以不用加括号,但是还是建议统一加上括号
接下来我们用这种方法来算出每种数据类型的大小,单位为字节:
由图可以看出各种类型的大小,此处不再赘述,同时不知道大家有没有发现一件有趣的事,int与long int的大小一致,double 与long double的大小一致,这是为什么呢?这是因为在C语言的规定中long int的大小只需要大于等于 int的大小就可以了,所以long int的大小可以为4也可以为8,double和long double也是同理
最后我们来介绍一下sizeof的返回值,C语言只规定是无符号整数,没有具体说明是整型还是长整型等等一系列数据类型,于是为了提高程序的可移植性,C语言提出了一个新的类型别名size_t,它的占位符为%zd,而不是使用整型的%d,具体占位符的作用和介绍将在介绍函数printf时细讲,请耐心观看
四、二进制转十进制、无符号数和有符号数以及数据类型的取值范围
- 在学习数据类型的取值范围前,我们必须知道二进制如何转十进制,采用的方法就是按权展开法,就是按二进制每一位的权重相加进行展开,二进制的权重如下图:
要计算它的大小只需一位一位相加,例如二进制数10110111转为十进制数的方法如图:
- 我们还需要了解什么是有符号数,什么是无符号数:
(1)无符号数(unsigned number):是相对于有符号数而言的,指的是全部二进制位均表示数值位,相当于数的绝对值,比如上图的10110111就是一个无符号数
(2)有符号数中左边第一位表示符号位,无需计算,与数的大小无关,其中符号位为0表示整数,符号位为1表示负数,以上图举例
其中第一位1表示负数即-号,第一位如果为0就是正数,如果还不能理解,请自行搜索查看,此处介绍只是为计算数据类型的取值范围做铺垫 - 数据类型的取值范围:
(1)我们在此介绍char类型的取值范围的算法,了解方法,其他数据类型的范围可以自行推测
(2)char类型:由第三点介绍的数据类型占用空间所讲的内容可知,char类型在内存中占用的大小为1个字节,也就是8个比特位,可以用8位1进制表示大小。
在C语言中有signed short和unsigned short,其中unsigned char 表示为无符号的char类型,没有符号位,那么它最小表示为八个0的二进制,换算为十进制就是0,最大为8个1的二进制,换算为十进制就是255,所以可知unsigned char的取值范围为0—255
signed char:表示为有符号的char类型,因为有符号位,所以只能用7位表示数值的大小,7个0的二进制换算为十进制为0,7位1的二进制换算为十进制为127,所以按理说其范围应该是(-127)----(+127),但是有一个特殊情况,就是10000000的有符号数表示为-0,00000000的有符号数表示为0,在数学中,这两个值应该是相同的,但是在计算机中它们并不相等,所以就将-0人为规定为-128,所以综上,signed char的取值范围为(-128)—(+127) - 基本上所有数据类型的取值范围都可以推测,但是有的数据类型,比如长整型占8个字节的空间,也就是64位二进制数,实在太大了,不好计算,所以我们只需要知道数据类型的取值范围的计算方法,以及一些简单的数据类型的取值范围即可,如何查看它们呢?可以下载软件everything查找文件limits.h(整型相关类型的取值范围)和文件float.h(浮点型相关类型的取值范围),找到后将其拖入VS即可查看各种数据类型的取值范围。
五、变量
在C语言中,经常变化的值称为变量,不变的值称为常量,在之前我们了解了许多数据类型,它们就可以用来创建变量
创建变量的本质就是在内存中开辟一个空间,用来存放我们的数据,而能存放数据的多少和存放哪种数据就由我们的数据类型决定,创建格式为:数据类型 变量名,比如:
int age; //整型变量
char ch; //字符变量
double weight; //浮点型变量
变量的分类:
- 全局变量:定义在大括号外的变量,如果想使用,在整个工程都可以想办法使用,生命周期是整个工程的生命周期
- 局部变量:定义在大括号内的变量,只能在自己的局部范围使用,生命周期是从大括号进入时开始,从大括号出来时结束,如果全局变量和局部变量重名,那么会优先使用局部变量
**变量的初始化:**在创建变量时给一个初始值叫做初始化,比如:
int age = 0; //整型变量,初始化值为0
我们需要注意两点:(1)在VS2022编译器中十分严谨,如果一个局部变量没有初始化就不让使用,局部变量一定要初始化(2)一个局部变量不初始化时它的值是随机的,全局变量没有初始化的时候默认是零
变量的存储:在学习C/C++时,我们会关注内存中的三个区域,栈区,堆区,静态区
- 局部变量存放在栈区
- 全局变量存放在静态区
- 堆区用来进行动态内存管理(以后会详细介绍)
六、算术操作符+、-、*、/、%
操作符又叫运算符,属于双目操作符,操作符两边的数据叫做操作数,双目操作符就是在两边都分别有一个操作数的操作符,比如1+1,“+”这个操作符两边有两个操作符,所以属于双目操作符
-
+、-、*:分别表示加减乘,与平常计算规则一致,此处不再赘述
-
/:表示除法,它有点特殊,如果两边都是整数,那么就执行整数除法,如果有任意一边是小数,或者两边都是小数就执行小数除法,如图:
如果/的两边都是整数,那么它就只会返回整数,5除以2的商为2,余数为1,所以结果为2,那怎么才能得到数学上5除以2等于2.5呢?很简单,我们只需要把5变成5.0或者把2变为2.0,或者两者都变即可,如图:
注意:小数默认会打印后六位 -
%:作用是取模,也就是取余数,比如上面的例子5/2的商为2,余数为1,那么5%2的结果就为1,如图:
七、赋值操作符:=和复合赋值
在变量创建时给一个值叫做初始化,在变量创建好后再给一个值,就叫做赋值,赋值操作符是=
- 连续赋值:比如:
int a = 3;
int b = 5;
int c = 0;
c = b = a+3;//从右往左依次进行赋值
它的规则是从右往左依次进行赋值,先计算a+3等于6,再把它赋值给b,最后再把b赋值给c,虽然C语言提供这种赋值方式,但是更推荐拆开来写,既容易理解,又方便以后调试,比如上述代码可以写为:
int a = 3;
int b = 5;
int c = 0;
b = a+3;
c = b;
- 复合赋值:在写代码时我们可能出现对一个变量进行自增,自减的操作,比如以下的代码:
int a = 10;
a = a+3;
a = a-2;
为了简便写出,C语言提供了复合赋值方法,比如:
int a = 10;
a += 3;//相当于 a = a+3;
a -= 2;//相当于 a = a-2;
像我们前面学的五个操作符都可以这样使用,+=,-=,*=,/=,%=,还有一些操作符也可以这样使用,后期再讲解
八、单目操作符++、–、+、-
我们知道了双目操作符的定义,也就不难理解单目操作符了,就是它只有一个操作数,接下来我们进行详细的讲解:
- ++:它的作用就是给自身加上一个1,起到自增1的作用,++又分为前置++和后置++,比如:
int a = 2;
++a;//前置++
a++;//后置++
它们的区别是前置++是先自增1,再进行其他操作,后置++是使用变量当前值,再对变量加一,前置++举例如下:
后置++举例如下:
- –:它的作用是给变量自减1,同样分为前置–和后置–,用法与++一致,此处不再赘述
- +和-:分别代表正负号,与数学里用法一致,此处也不再赘述
九、强制类型转换
在操作符中还有⼀种特殊的操作符是强制类型转换,语法形式很简单,形式如:(类型)
比如输入代码 int a = 3.14; 编译器会报警告,为了消除这个警告,我们可以使用强制类型转换:
int a = (int)3.14//a是int类型, 3.14是double类型(浮点型默认为double)
//两边的类型不⼀致,编译器会报警告
//这样就是将3.14强制类型转换为int类型,这种强制类型转换只取整数部分
最后申明一点,强扭的瓜不甜,为了增强代码的可读性,减少出现bug的概率,除非迫不得已,否则不要使用强制类型转换