一.数据类型的介绍
1.为啥要分数据类型:我们学习的代码是为了解决生活中的实际问题服务的,例如我们创建一个电商网站,就可能会涉及以下内容:
此时,我们发现,我们需要写的内容可能是商品名称(字符串),可能是价格(数字,其中包括整数和小数),因此,我们在写代码中,划分好数据类型,有助于我们进行代码的书写。
二.有哪些数据类型
如图,数据类型可分为内置类型和自定义类型,其中,内置类型是C语言系统自带的类型,直接可以使用,而自定义类型,需要我们在代码中自己创造,然后才能在代码内部进行使用。
2.1字符型(char):
我们在想输出字符型的代码的时候,需要使用char来创建数组,一般可以使用以下两种书写方式,
char arrc1[]="abc";
char arrc2[] ={'a','b','c'};
如果我们单纯输出字符,使用%c方式,但如果我们试图输出整个字符串,就需要使用%s的方式,但一定要注意,这两者输出的结果有差异:
我们使用代码:
printf("%s\n",arrc1);
printf("%s\n",arrc2);
发现第一条运行正常,第二条在abc后出现了奇怪的东西
这是因为字符串的输出会在被读取到\0的时候终止,而\0也是一个字符,在第一种书写方法中,\0被隐藏在了abc的后面,但在第二种的书写方法中,整个arrc2只有abc三个字符,因此系统会一直进行读取,越界读取到\0为止,因此我们会看到乱码,那如何来解决呢?
对于第二种写法,我们可以这样来写:
char arrc2[] ={'a','b','c','\0'};
这样,在输出的时候,我们就可以正常输出啦。
2.2整型
整型类型是用来描述一个整数。
如果我们想要输入一个整数,我们通常会使用int类型。
int main()
{
int a = 10;
return 0;
}
在这里,我们就使用了int创建了一个变量a,并给a赋值啦。
虽然在大部分情况下,我们都会使用int,但实际上,还有很多类型都可以来表示整型
在其他的书写中,我们会把int给省略,如下:
int a = 10;
short b = 20;
long c = 30;
long long d = 40;
他们的区别在于所占用的字节大小不同,有:long long >long >= int>short 。
而占用字节越多,所能表示的范围越大。
2.3浮点型
当我们想要描述小数的时候,我们会使用浮点型,其中包括float(单精度浮点型),double(双精度浮点型),还有更大的long double,他们的主要区别也是占用字节的不同,long double> double >float, double类型所能表示的范围也更大。
2.4布尔类型
如果我们想判断一个事情的对错,我们会使用布尔类型来进行判断。在很久以前我们使用的是_Bool
如下代码,我们可以实现一个简单判断:
_Bool flag = true; //true,false
if (flag)
printf("hehe");
else
printf("haha");
但需要注意,我们用_Bool定义的赋值只能用true(真),false(假),不能赋值其他的。
后来为了书写方便,我们也可以将_Bool写为bool,如下:
bool flag_1 = false;
但是我们应该注意,布尔类型是我们单独引进的,所以在头文件中,应该加入代码
# include <stdbool.h>
才能正常运行,否则,系统编译时无法理解bool的含义,而导致编译出错
三.数据类型的长度
如果我们想要知道字符类型的长度,我们使用的是sizeof()函数,在这里应该注意的是,这是与字符串有关的函数,因此需要引进一个新的头文件
#include <string> //与字符串有关则必备
然后我们就可以把他们的长度给打印出来啦
printf("%zd\n", sizeof(char));
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));
printf("%zd\n", sizeof(_Bool));
结果如下
很好,我们现在就可以把各个类型的长度了解清楚啦。
但我们可能会有一个问题,如果我们写了如下的代码
int a = 10;
printf("%zd",sizeof(int));
printf("%zd",sizeof(a));
它的结果是多少呢?
结果都是4,因此我们可以了解,如果打印的是某个我们设定的变量,实际打印出来的是我们所定义的变量类型的字节长度。
那如果我们遇到了这样的代码
int a = 3;
short b = 2;
printf("%zd\n", sizeof(a = b + 3));
printf("%d", a);
它的输出结果是多少呢?
我们发现,siezeof()函数的计算,所进行的只是数据类型的计算,并不会进行代数运算。
为什么我们在一般输出的时候使用的是%d,而在输出sizeof()函数所表达的结果时候,所使用的是%zd呢?这与sigened与unsigned有关。
signed与unsigned
signed所代表的是我们所定义的变量可正可负数,而unsigned所代表的是所定义的变量只能是0或者正数(非负数),我们知道,变量类型的所占用字节的大小是固定的,因此,unsigned前缀所定义的变量类型会在正数部分的数量变为signed前缀的二倍。
具体书写方式如下:
unsigned int b = 10;
unsigned long int c = 100;
unsigned long long int d = 1000;
这样就可以了,而我们一般用的 int类型等,就是包括正负数的,所以将signed省略。
如果是unsigned前缀定义的变量,我们如何输出呢?
代码如下:
printf("%u\n", b);
printf("%lu\n", c);
printf("%llu\n", d);
这里注意,对于整型,长整型,长长整型,输出时候是不同的。
而在我们输出某个变量类型长度的时候,一定得到的是一个正数,为了有所区分,我们使用%zd来进行描述。
四.变量
4.1什么是变量
C语言中经常变化的值就是变量
定义方法是数据类型+变量名,例如:
int a = 10;
但是我们应该注意,定义的变量名的开头不能是数字
int 2b;//err
int _2b;//ok
int math_score;//ok
也不能与其他的变量类型重复
int char
4.2全局变量与局部变量
全局变量就是在大括号外部定义的变量,适用范围更广,可在整个工程中使用
局部变量是在大括号内部定义的变量,只能在自己的大括号内使用
我们写下如下的代码来详细分析:
#include <stdio.h>
int b = 100; //大括号外面定义的,全局变量
int main()
{
printf("%d",a); //句式1
printf("%d",b); //句式2
printf("%d",c); //句式3
int a = 10; //大括号内部定义的,局部变量
{
int c = 20; //也是在内部定义的,局部变量
printf("%d",a); //句式4
printf("%d",b); //句式5
printf("%d",c); //句式6
}
printf("%d",a); //句式7
printf("%d",b); //句式8
printf("%d",c); //句式9
ruturn 0;
}
我们在上面的代码中,定义了全局变量b,以及两个局部变量a和c,
全局变量b相当于共享单车,所有的都可以使用
局部变量a相当于自家的汽车,自己家里所有的人都可以使用
全局变量c相当于我们自己的卧室,只有我们自己能使用
全局变量b在整个工程中都能使用,因此句式2,5,8都可以正常运行
句式1:虽然与a位于同一个大括号中,但是在定义a之前,因此无法通过编译
句式3:根本与c不在一个大括号中,无法编译
句式4,7:与a在一个大括号中,且在a定义之后,因此可以正常运行
句式6:与c在一个大括号中,在c定义之后,可正常运行
句式9:与c不在一个大括号中,无法编译
全局变量储存在内存的静态区,局部变量储存在内存的栈区。
现在你了解局部变量和全局变量了吗?
五.运算符
我们常见的运算符有: + - * / %
对于+,-,比如有 34 + 55,其中,34是左操作数,55是右操作数,+有两个操作数,他是双目操作数,-同理
在乘法运算中,我们使用的是*
在进行除法的运算中,我们使用/,但是在可能会出现两个数字相除后是小数的情况
对于 除法操作符
1.除号的两端如果都是整数,执行的是整数除法
2.如果要计算出小数的效果,那么除号的两端至少有一个数得是浮点数
整数除法很好理解,拿为什么小数需要至少有一个是浮点数呢?
在计算机的运算中,会有余数这个概念。
例如:5 / 2 = 2.5,这是我们在日常生活中的计算
在计算机中,如果我们试图使用这样的代码
printf("%d\n", 5 / 2);
结果是2,它的运算是 5 / 2 = 2……1
所以我们如果想输出一个小数,可以这样写
printf("%lf\n", 5.0 / 2.0);//2.5
运用%f或者%lf,并且浮点数进行计算即可。注意,%f 和 %lf 打印的时候小数点后默认打印6位小数
那我们如何让他保留一位小数呢
printf("%.1lf\n", 5.0 / 2.0);//2.5
这样即可
%是取余的含义, 5 % 2 = 1,在除法运算中,出现了余数,所以写出了1,如果整除,会是0
取余后的结果会与被除数一致,例如
11 % -5 =1 -11 % -5 = -1
六.变量的赋值
我们可以使用这样的方法进行赋值:
int a = 10;//初始化
a = 20;//赋值
但是会有连续赋值的情况,如下
int a = 3;
int b = 5;
int c = 0;
c = b = a + 3;
我们采用从左到右的方法,先计算 a + 3,将其赋值给 b,再将 b赋值给c,即可
我们还可能见到这样的式子
int a = 10;
a = a + 4;
也是从左到右进行计算,计算a + 4 = 14,再将14赋值给a,即可
当然也有另一种写法
a += 4 ;
两者效果相同,下面的是更简便的写法
最后,感谢大家的观看