关键字(1)auto和register详解

关键字第一讲

关键字分类

C语言一共有多少个关键字呢?答案是32个,但是在c99中新增了五个。目前主流编译器对c99支持不是很好我们默认为32个。

auto 声明自动变量
short 声明短整型变量或函数
int 声明整型变量或函数
long 声明长整型变量或函数
float 声明浮点型变量或函数
double 声明双精度变量或函数
char 声明字符型变量或函数
struct 声明结构体变量或函数
union 声明共用数据类型
enum 声明枚举类型
typedef 用以给数据类型取别名
const 声明只读变量
unsigned 声明无符号类型变量或函数
signed 声明有符号类型变量或函数
extern 声明变量是在其他文件正声明
register 声明寄存器变量
static 声明静态变量
volatile 说明变量在程序执行中可被隐含地改变(后期重点介绍)
void 声明函数无返回值或无参数,声明无类型指针
if 条件语句
else 条件语句否定分支(与 if 连用)
switch 用于开关语句
case 开关语句分支
for 一种循环语句
do 循环语句的循环体
while 循环语句的循环条件
goto 无条件跳转语句
continue 结束当前循环,开始下一轮循环
break 跳出当前循环
default 开关语句中的“其他”分支
sizeof 计算数据类型长度
return 子程序返回语句(可以带参数,也可不带参数)循环条件

程序的概念

首先我们先来了解一下我们平时运行的程序是什么,第一我们在编写代码的时候编写的是文本代码。当我们编译链接之后就生成了二进制的可执行程序就是后缀为.exe的文件。

如果我们是在vs2019这个编译器中,我们点击生成解决方案之后就会在debug的文件夹下生成一个.exe的文件,这个文件就是我们文本代码转换成的二进制可执行程序,双击就可运行起来。

那么程序在没有运行的时候是在哪里呢?

我们要知道,任何程序在运行之前都必须被加载到内存之中,之后才可以运行。我们平常双击打开软件其实就是将软件程序加载到内存之中。

1.为什么,这个涉及到体系结构里面的冯诺依曼结构体系,后续详细说,先简单介绍,就是将计算机分为几个部分,输入设备包括:键盘,硬盘。输出设备:显示器。然后还有内存和CPU这两个。

我们的数据一开始是在硬盘中,我们把数据先拿到内存然后cpu读取内存的数据进行计算,算完之后再写入内存,从内存在写入硬盘或输出到显示器。

为什么要这么做呢?原因很简单,效率高,因为cpu的读取速度很快,但是硬盘的速度很慢,这时候要把硬盘中要使用的数据预加载到内存中,然后cpu既可以很快的读取到数据。

举个例子,比如打印机要打印一部分东西,我们都是先把要打印的东西预加载到打印机的缓冲区中,然后在由cpu去读取数据,而不是需要数据就去硬盘里面找,这样效率是很低的。

变量

为什么要定义变量

计算机的作用是计算数据,但是在程序中,并不是所有的数据都在一上来就被计算的,这是就需要吧数据暂时储存起来,于是就用到了变量。当然有人会问,我们用到数据直接去硬盘里面取出不就行了吗?这种方法当然可以但是效率会很低。

比如我们吃饭不是一上来直接把所以菜都吃掉,我们需要一口一口的吃,这时候就需要一个盘子来暂时盛菜,这个盘子就是变量。当然有人会问呢,我么直接去锅里面吃不久可以了。这个可以是可以但是效率很低。

定义变量的本质是

1.程序只有在运行的时候才被加载到内存中,所以我们为变量开辟的空间也是在内存中。
2.程序的计算过程中需要用到变量。
所以定义变量的本质就是,在内存中开辟一块空间用来存储数据。

变量声明的本质是(通常声明全局变量)

广而告之
声明可以有很多次,但是定义只能有一次。(你可以多次声明你有女朋友但是你表白只能表白一次)

告诉编译器我这个变量存在

变量的赋值和初始化

变量初始化,就是我们在定义变量的时候就给他放一个初值,这是他与生俱来的。
赋值就是,我们在已经开辟好的空间内放入一个值,只是后天的。

1.1关键字auto

auto只能用来修饰局部变量。
auto就是其字面意思,自动开辟空间,自动销毁空间。
我们定义的局部变量默认都是auto类型的

int a = 10;
auto int a = 10;//这两个是一样的,第一个省略了auto

说道变量就不得不提到变量的作用域和生命周期了

作用域(是一个空间的概念)

它说明了这个变量在这个范围内是有效的而出了这个区域就是无效的

生命周期(是一个时间点的概念)

这里要注意是时间点,他不是一个具体到多少分钟这种概念。
生命周期表示的是变量从创建到释放的这两个时间点。

局部变量

理解了作用域和生命周期可以之后来看局部变量
局部变量的作用域在他所处的那个代码块内,也就是那个大括号内。
局部变量的生命周期就是从定义处开始到出作用域变量释放这个时间点
局部变量的定义是在对应的函数栈帧上开辟的。

如果局部变量和全局变量同名,那么在局部变量的作用域内同名的全局变量不起作用

#include<stdio.h>
int a = 10;
int main()
{

    for(int i=0;i<10;i++)
    {
        int a = 20;
        printf("%d",a);//这里打印的是20
        if(1)
        {
            int a = 30;
            printf("%d",a);//这里打印30;
        }
        printf("%d",a);//这里打印20
    }
    printf("%d",a);//这里打印10

    return 0;
}

上述代码说明了,局部变量在他所在的代码块才可以使用,而全局变量在哪里都可以使用。并且发生命名冲突的时候局部变量范围内全局变量不起作用。

2.关键字register

其实,CPU主要是负责进行计算的硬件单元,但是为了方便运算,一般第一步需要先把数据从内存读取到CPU内,那么也就需要CPU具有一定的数据临时存储能力。
注意:CPU并不是当前要计算了,才把特定数据读到CPU里面,那样太慢了。
所以现代CPU内,都集成了一组叫做寄存器的硬件,用来做临时数据的保存。

首先register是建议类型的关键字,并不是你用register修饰的变量一定会被放在寄存器中。
聊到寄存器就要了解计算机的存储上的结构。

寄存器
cache
内存
ssd、硬盘、flash

自下而上,这些硬件容量越来越小,效率越来越高,价格越来越贵。而我们cpu的计算速度是非常快的。那么如何让高速的cpu和低速的硬件相匹配呢?
这就要用到缓存计数,我们将要用到的数据从硬盘拿到内存中,在有内存加载到高速缓存和寄存器中。这样cpu就可以快速的计算数据了。
所以我们上面描述的硬件都是下游硬件的缓存。

现在我们还需要知到到底什么样子的数据才需要使用register修饰呢?

  1. 局部的(全局会导致CPU寄存器被长时间占用)
  2. 不会被写入的(写入就需要写回内存,后续还要读取检测的话,register的意义在哪呢?)
  3. 高频被读取的(提高效率所在)
  4. 如果要使用,请不要大量使用,因为寄存器数量有限

其次还需要了解加载到寄存器的变量不可去地址,地址是在内存中的地址,变量不在内存中了自然不可以取地址。

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KissKernel

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值