哈喽大家好,我又来更新了,我这样的高效率博主哪里找,速速来一波点赞和关注。话不多说,开始今天的学习!
C语言数据类型和变量
1.数据类型介绍
类型就是一类数据所拥有的共同特征,在C语言中提供了丰富的数据类型来便于大家描述生活中的数据,用整型类型来描述整数,字符类型来描述字符,浮点型类型描述小数。
数据类型又主要分为两大类
自定义类型 和 内置类型
这里就写给大家介绍内置类型,自定义类型也会在后续的学习过程中介绍(主要是博主还没有完全弄清楚)
1.内置类型:
1.字符型(character)
描述字符
char
[signed] char
unsigned char
(signed 表示有符号的 unsigned 表无符号的)
“[ ]”表示可省略的意思
2.整型
描述整数
整型的分类比较多,区别主要在于根据需要储存空间不同所导致的开辟内存空间大小不一样
1.短整型
short [int]
[signed] short [int]
unsigned short [int]
2.整型
int
[signed] int
unsigned int
3.长整型和更长的整型(在c99中引入)
long [int] long long [int]
[signed] long [int] [signed] long long [int]
unsigned long [int] unsigned long long [int]
3.浮点型
描述小数
float 单精度
double 双精度
long double
4.布尔类型(bool)
描述真假
这个也是在c99标准中才新加入的,用整数0表示假,非零值表示真
本质上和C语言0为假,1为真一样
使用布尔类型的时候需要头文件<stdbool.h>
5.数据类型的长度
每种数据类型都有自己的长度,使用的类型不同在内存中开辟的空间也不同,能容纳的数据长度也就不同
1.sizeof操作符
sizeof是关键字也是操作符,专门用来计算类型长度,单位是字节
(复习:关键字是C语言保留的单词,具有特殊含义和功能,通常不能用作变量名或其他标识符)
sizeof(类型)
sizeof 表达式 //表达式的话可以省略括号,这个表达式是不参与运算的,根据其类型得出大小
sizeof的计算结果是size_t类型(为了类型不同出错所规定的)
详细解释:
关于sizeof的返回值,C语言只是规定了是无符号整数(因为申请的字节空间不可能是负数),但没有规定具体的类型,这时候就会因为系统的不同而有不同类型的返回值,类型不同了对于printf的占位符也会不同,这样会很大程度的影响程序的可移植性(代码在A编译器可以运行,B则不行,这样的代码并不太好)。
针对这个问题,C语言创造了一个类型来统一表示sizeof的返回值,就是size_t,其在printf中的占位符是%zd
下面进行一些举例:
#include<stdio.h>
int main() {
int a = 10;
printf("%zd\n", sizeof(a));
printf("%zd\n",sizeof a);//a是变量的名字,也可以省略sizeof后的()
printf("%zd\n",sizeof(int));
printf("%zd\n", sizeof(2 + 1.5));
return 0;
}
2.各类数据类型长度
是由数据类型决定的长度,与数据本身的位数无关,但需注意位数过大会越位
不同编译器的值也会不一样,比如int(4)的长度可能会等于long(8)的长度,都是4
是因为sizeof(long)>=sizeof(int),有的编译器取值就是等号,但实际上申请的空间是long>int的
同理的还有double(8)和long double(16)
下面直接用代码示例:
#include<stdio.h>
#include<stdbool.h>
#define _Bool bool//define 用前面的替换后面的
int main() {
printf("%zd\n", sizeof(char));
printf("%zd\n", sizeof(_Bool));
printf("%zd\n", sizeof(short));
printf("%zd\n", sizeof(int));
printf("%zd\n", sizeof(long));
printf("%zd\n", sizeof(long long));
printf("%zd\n", sizeof(float));
printf("%zd\n", sizeof(double));
printf("%zd\n", sizeof(long double));
return 0;
}
这是用vs2022得出的结果,可以看出该编译器就是采用的等号显示
3.延伸一下
对于二进制来说 1 就是一个比特位,比特也计算机中最小的单位,下面是单位换算
1字节=1byte=bit
1KB=1024byte
1MB=1024KB
1GB=1024MB
1T=1024GB
1PB=1024T
4.sizeof表达式不计算
在上面我们提及到了这个点,下面我们代入代码测试中去理解
关注这个表达式:a = b + 1
根据定义可以知道,a = 2,b = 10,那结果应该是10+1=11,但我们输出的却是2
这个原因就是因为a的类型是short,占两个字节,sizeof的计算是只与类型有关,所以哪怕按正常逻辑思考a的实际值已经是11。
具体原因:因为sizeof在代码编译的时候就已经确定的数据类型,但是表达式的执行是在代码运行的时候才会执行,但编译期间sizeof已经被处理了。
#include<stdio.h>
int main() {
short a = 2;
int b = 10;
printf("%d\n", sizeof(a = b + 1));
printf("a=%d\n", a);
return 0;
}
2.signed和unsigned
C语言使用这两个关键字去修饰字符型和整型类型
signed表示一个类型带有正负号,包括负值
unsigned表示一个类型不带正负号,只能表示零和正值
int
对于int类型,默认带有正负号,即 signed int a == int
当然int也可以不带正负号,这时候就是 unsugned int (这个int是可以省略的哦)
*(表示正负可不写signed,表示正一定要写unsigned)
整数变量声明unsigned可以让同意长度的内存表示的最大整数值翻一倍
这也很好理解,举个很简单的例子-1~1是三个数字,最大整数是1,但0~2一样是三个数字,但最大整数值是2翻了一倍,或许这个很小,翻了一倍也只是增加了1,但是在计算机语言中是以二进制为基础的,16位内存可以存储的数字就是2的十六次方。
signed short int的取值范围是-32768~32767,unsigned short int的取值范围就是0~65535
char
说完了int类型,接下来讲讲char类型
char前面也可以使用signed和unsigned
注意:在C语言中,char类型默认是否带有正负号是由系统决定的
也就是说,char !=signed char(在大部分编译器中是对等的,但依旧要注意)
char可能是signed char,也可能是unsigned char
所以我们需要明晰char的正负号时一定要加上这两个关键字
这里分享两个可以查看数据类型取值范围的两个文件
limits.h可以查看整型类型的取值范围
float.h可以查看浮点型类型的取值范围
3.变量
1.创建变量
C语言中,经常变化的量就是变量,不变的量就是常量
我们使用类型去创建变量
例:
int a;/数据类型 变量名
char ch;
double weight;
在创建变量的时候给于一个初始值,这就是初始化
int a = 10;
2.变量的分类
1.全局变量
在大括号外部定义的就是全局变量
2.局部变量
在大括号内部定义的就是局部变量
两者的区别类似共享单车和我的自行车
注意:博主刚开始接触的时候因为这就以
main(){
}
的这个大括号为标准,但并不是这样(虽然大部分情况下确实如此,但也仅限于一些简单代码),全局和局部是相对来说,相对于某一个大括号而言
*如果全局变量和局部变量的名字相同的,是会优先使用局部变量
*全局变量放在内存的静态区
*局部变量放在内存的栈区
4.结束语:
OK,今天学习总结了数据类型和变量的一些知识,相信大家和博主都是收获满满吧,虽然博主大一学过了一遍,但重新来总结一遍依然学到了不少知识,这就是温故而知新吧,希望可以和大家一起进步哦!