C语言入门之数据类型和变量(简单易懂)

一.数据类型的介绍

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 ;

两者效果相同,下面的是更简便的写法

最后,感谢大家的观看

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值