C语言关键字深度解剖{autoregister}

Posted .阿Q.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言关键字深度解剖{autoregister}相关的知识,希望对你有一定的参考价值。

写在前面:

💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖

本书基于《C语言深度解剖 - 程序员面试宝典》一书,结合自身知识的不足,系统地整理出所学重要的、不熟悉的重难点知识;做到以书为主线,重点多讲,难点深讲。(๐॔˃̶ᗜ˂̶๐॓)(๐॔˃̶ᗜ˂̶๐॓)🎶🎶🎶🎶🎶🎶🎶🎶🎶🎶🎶🎶

取其精华去其不足,深入细致地剖析C语言知识,结合我自身的实际,整理一些不常见的知识点,争取C语言学的更加扎实,严谨!

🐱‍👤🐱‍👤🐱‍👤🐱‍👤🐱‍👤🐱‍👤🐱‍👤🐱‍👤🐱‍👤🐱‍👤🐱‍👤🐱‍👤🐱‍👤🐱‍👤🐱‍👤🐱‍👤🐱‍👤文章仅记录自己所不熟知的内容,其他内容在pdf课件见(   常看!! )

目录

一、关键字分类

 二、第一个C程序

三、定义与声明

四、auto(了解即可)

1.局部变量、全局变量、代码块

2.作用域与生命周期区别

3.auto相关

五、register

那么什么样的变量,可以采用register呢?


一、关键字分类

C语言一共多少个关键字呢?一般的书上,都是32个(包括本书),但是这个都是 C90(C89) 的标准。其实 C99 后又新增了5个关键字。不过,目前主流的编译器,对 C99 支持的并不好,我们后面默认情况,使用 C90 ,即,认为32个

 二、第一个C程序

#include <stdio.h>
#include <windows.h> //windows.h系统头文件,仅仅是为了停屏
int main()

    printf("hello world!\\n");
    system("pause"); //pause停屏,暂时不讲,会用就行

    return 0;
 

很简单的程序别急,我想说的远不止是这个程序那么简单,而是深究其中的  一点一点的细节部分    ————————

  1. 我们的VS运行程序,是干什么?                                                                                                                                                                ————  是将 文本文件——>可执行文件(二进制文件)【每执行一次程序就会在相应文件夹生成;点击清理,文件夹的.exe、.obj......就会消失;再执行后又会出现这些.exe、.obj......】

这就和我们双击文件夹中的.exe文件,执行的效果一样,都是“  hello  world!  ”那么再想?

我们双击桌面上的应用程序图标,又怎么能运行起来呢??

——————那是因为双击的本质是运行程序,将程序加载到内存当中

                                    任何程序在运行之前,都必须加载到内存当中

任何程序在运行之前,都必须加载到内存当中是为什么呢??——————  为了,快!

硬件规定

三、定义与声明

四、auto(了解即可)

1.局部变量、全局变量、代码块

局部变量:包含在代码块中的变量叫做局部变量局部变量具有临时性。进入代码块,自动形成局部变量,退出代码块自动释放。[网上很多说函数中的变量是局部变量,不能说错,但说法是不准确的]

全局变量:在所有函数外定义的变量,叫做全局变量。全局变量具有全局性。

代码块:用 括起来的区域,就叫做代码块

2.作用域与生命周期区别

作用域:该变量的有效区域  (指的是该变量的可以被正常访问的代码区域)
生命周期:时间概念!  (什么时候开辟,什么时候结束)

3.auto相关

如何使用:一般在代码块中定义的变量,即局部变量,默认都是auto修饰的,不过一般省略

默认的所有变量都是auto吗?   不是,一般用来修饰局部变量

结论:已经很老,基本永不使用。
 

五、register

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

寄存器的认识

当前,各位童鞋可以不关系硬件细节,只要知道CPU内集成了一组存储硬件即可,这组硬件叫做寄存器。


寄存器存在的本质

在硬件层面上,提高计算机的运算效率。因为不需要从内存里读取数据啦。

register 修饰变量

尽量将所修饰变量,放入CPU寄存器中,从而达到提高效率的目的

那么什么样的变量,可以采用register呢?

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

 这里除了上面的,再有一点,就是register修饰的变量,不能取地址(         因为已经放在寄存区中了嘛,地址内存相关的概念)

#include <stdio.h>
#include <windows.h>
int main()

	register int a = 0;
	printf("&a = %p\\n", &a);
	//编译器报错:错误 1 error C2103: 寄存器变量上的“&”
	//注意,这里不是所有的编译器都报错,目前我们的vs2013是报错的。
	//鉴于同学们刚开始学,不给大家增加负担,我们后面再慢慢引入另一个编译器。
	system("pause");
	return 0;

register修饰的变量,可以被写入

#include <stdio.h>
#include <windows.h>
int main()

	register int a = 0;
	a = 200;
	printf("%d\\n", a);//200
	system("pause");

	return 0;

结论:

该关键字,不用管,因为现在的编译器,已经很智能了,能够进行比人更好的代码优化。
早期编译器需要人为指定register,来进行手动优化,现在不需要了

以上是关于C语言关键字深度解剖{autoregister}的主要内容,如果未能解决你的问题,请参考以下文章

想学好C语言这些关键字不能少(深度解剖)

C语言关键字深度解剖{staticsizeof}

C语言关键字深度解剖{staticsizeof}

[ 深度解剖C语言 ] 关键字 ---- auto register

以下几个C语言关键字你真的得懂(深度解剖)

超详细的C进阶教程!深度解剖C语言自定义类型