C语言关键字之auto register详解

目录
  • 一:auto
    • 作用域
    • 生命周期
    • auto
  • 二:register
  • 总结:

一:auto

在学习关键字auto之前我们需要先了解两个概念:作用域和生命周期。

作用域

作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用

的 而限定这个名字的可用性的代码范围就是这个名字的作用域。

局部变量的作用域:作用范围包含在代码块中的变量。在哪儿内定义,只在其范围内有效。

全局变量的作用域:在所有函数外定义的变量。整个项目中都有效。

我们用简单代码来理解一下:

int a = 20;
int main()
{
	if (1)
	{
		int b = 10;
		printf("%d", b);
	}
	return 0;
}

这段代码中我们可以看到我们创建了两个变量,一个是全局变量 a ;一个是局部变量 b 。

根据作用域的定义我们可以知道:

全局变量a的作用域是整个工程:

局部变量b 的作用域只是包含在if括号内部:

为了我们更好的理解这个代码我们写几种代码,加深理解:

int a = 20;
int main()
{
	if (1)
	{
		int b = 10;
	}
	printf("%d", a);
	printf("%d", b);
	return 0;
}

这段代码我们发现报错

虽然我们b创建了,但是b是一个局部变量,作用域只在代码块内部( if 括号内部 ),不包括printf这一行,因此程序报错,访问不到b。

特殊的:

当局部变量和全局变量发生冲突时,局部变量优先。

这句话的意思是:当定义的变量名相同时,局部变量优先

int a = 20;
int main()
{
	a = 10;
	printf("%d", a);
	return 0;
}

我们打印就可发现:

当全局变量和局部变量发生冲突时,局部变量优先。为了避免这种问题的出现,尽量不要使用相同的变量名定义。

生命周期

变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段

局部变量的生命周期是:进入局部变量所在范围开始 ----> 出了局部变量的范围结束

全局变量的生命周期是:整个程序的生命周期。生命周期main函数进入--->结束 整个程序的生命周期

为了更方便的理解:我们可以通俗的理解为,一个变量的存活时间,就是这个变量的生命周期。

例:古代某一皇帝从出生-->驾崩。从出生到驾崩这一段时间就是这位皇帝的生命周期。

// ***************生命周期***********
//int  g = 100;//全局变量的生命周期:
//			   //生命周期main函数进入--->结束 整个程序的生命周期
//int main(){
//	{  // 局部变量生命周期:
//	   //进入局部变量所在范围开始 ----> 出了局部变量的范围结束
//		int a = 100;
//		printf("%d\n", a);
//	}
//
//
//	return 0;
//}

auto

auto号称是最宽宏大量的关键字

auto的使用:一般在代码块中定义的变量,局部变量,默认都是auto修饰的。只在本代码块中使用 auto可省略。

用代码解释就是:

auto int g_val = 100;
int main()
{
	for (auto int i = 0; i < 10; i++)
	{
		printf("i = %d\n", i);
		if (1)
		{
			auto int j = 1;
			printf("before: %d\n", j);
			j++;
			printf("after: %d\n", j);
		}
	}
	return 0;
}

由于auto只可修饰局部变量

因此第一句auto int g_val = 100;是错误的

在之后的代码内部的全局变量中,auto所修饰的局部变量中的auto都是可以省略的,因此我们也说auto是最古老的关键字,我们在平时的编程中也可省略auto。

二:register

register -- 寄存器   ----最快的关键字

我们首先要了解存储等级

离CPU越近的存储单元,效率越高,成本单价越高。

离CPU越远的存储单元,效率越低,成本单价越低。

对于任意一种硬件而言,上游硬件都是下游硬件的缓存,因此我们可以说寄存器是下游存储设备的缓存。

寄存器的本质:本质是在硬件层面上,提高计算机的运算效率。

什么变量可以用register

1.局部变量(全局变量导致CPU寄存器被长时间占用)

2.不会被写入(写入就要写回内存,要重新加载,无意义)

3.被高频使用(提高效率所在,放在寄存器,不用访存读取,提高效率)

int main()
{
	register int val = 100;
	//寄存器变量没有地址,不能取地址
	val = 200; //可以被写入
	printf("%d\n", val);
	// 在gcc编译器下 也不允许取地址
	return 0;
}

提示:不要大量使用register,因为寄存器的数量有限。

由于使用register关键字,直接将val存在寄存器内,因此val没有内存地址,因此不能进行取地址操作。

总结:

包括作用域,生命周期,auto和register关键字的理解是使用。

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • C语言关键字总结解析

    C语言关键字总结 1.关键字变更历史 1999年12月16日,ISO推出了C99标准,该标准新增了5个C语言关键字: inline restrict _Bool _Complex _Imaginary(注意bool 从来不是C语言的关键字) 2011年12月8日,ISO发布C语言的新标准C11,该标准新增了7个C语言关键字: _Alignas _Alignof _Atomic _Static_assert _Noreturn _Thread_local _Generic 2.关键字列表 auto

  • C语言关键字auto与register的深入理解

    关键字概述很多朋友看到这儿可能会有疑问,往往其它讲C语言的书籍都是从HelloWorld,数据类型开始C语言学习的,为什么我们要从C语言的关键字开始呢?关于这点,我有两点需要说明:本章节面向的读者对象是有一定的C语言基础知识的朋友(至少应该学习过大学里的C语言程序设计等类似的课程)本章节结合了作者多年嵌入式工作.研究.教学经验而作,由计算机底层硬件到上层软件设计融会贯通,中间有大量的深入浅出的示例 在我对C语言进行培训的时候,往往就是从C语言的关键字入手,因为C语言的关键字蕴含了C语言的全部的词

  • C 语言基础之C语言的常见关键字

    目录 ​1.auto 2.register 3.signed和unsigned 4.typedef 5.extern 6.拓展 首先我们简单的和这些关键字见见面(被高亮的关键字是今天要介绍的) 这其中有大家熟知的数据类型:int,char,float,double- 也有控制语句用到的:if,for,do- 还有一些就是今天主要介绍的关键字. 至于还有一些新增的关键字,以上表格未曾提到,大家如果想去了解,可自行查找. 个别术语介绍(可先跳过,后文如若遇到不懂,可回来了解) 自动变量:指的是局部作

  • C语言关键字大全(共32个)

    C语言一共有32个关键字,如下所述: auto :声明自动变量 short :声明短整型变量或函数 int: 声明整型变量或函数 long :声明长整型变量或函数 float:声明浮点型变量或函数 double :声明双精度变量或函数 char :声明字符型变量或函数 struct:声明结构体变量或函数 union:声明共用数据类型 enum :声明枚举类型 typedef:用以给数据类型取别名 const :声明只读变量 unsigned:声明无符号类型变量或函数 signed:声明有符号类型

  • C语言关键字之auto register详解

    目录 一:auto 作用域 生命周期 auto 二:register 总结: 一:auto 在学习关键字auto之前我们需要先了解两个概念:作用域和生命周期. 作用域 作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用 的 而限定这个名字的可用性的代码范围就是这个名字的作用域. 局部变量的作用域:作用范围包含在代码块中的变量.在哪儿内定义,只在其范围内有效. 全局变量的作用域:在所有函数外定义的变量.整个项目中都有效. 我们用简单代码来理解一下: int

  • C++类与对象深入之引用与内联函数与auto关键字及for循环详解

    目录 一:引用 1.1:概念 1.2:引用特性 1.3:常引用 1.4:使用场景 1.5:引用和指针的区别 二:内联函数 2.1:概念 2.2:特性 2.3:面试题 三:auto关键字 3.1:auto简介 3.2:auto使用细则 3.3:auto不能推导的场景 四:基于范围的for循环 4.1:范围for循环的语法 4.2:范围for循环的使用条件 一:引用 1.1:概念 引用不是定义一个新的变量,而是给已经存在的变量取一个别名.注意:编译器不会给引用变量开辟内存空间,他和他的引用变量共用同

  • C语言入门篇--注释,关键字typedef及转义字符详解

    目录 注释 1.注释意义 2.两种注释风格 2.1 C语言注释风格 2.2 C++注释风格 关键字typedef 1.注意 2.用法 语法结构 转义字符 1.转义字符及其含义 2.字面 转 特殊 3.特殊 转 字面 注释 1.注释意义 (1)代码中有不需要的代码可以直接删除,也可以注释掉. (2)有些代码比较难懂可以注释一下. 2.两种注释风格 2.1 C语言注释风格 /*xxxxxx*/ 一次可以注释一行或多行,但不能嵌套注释. eg: #include <stdio.h> int main

  • Go语言包和包管理详解

    目录 1 包简介 1.1 工作空间 1.2 源文件 1.3 包命名 1.4 main 包 2导包 2.1 两种方式 2.2 包的别名 2.3 简洁模式 2.4非导入模式(匿名导入) 2.5 导包的路径 2.6 远程导入 3 初始化 init 3.1 init总结 4 包管理 4.1 演变过程 4.2 Go Model优点 4.3 启用go module 4.4 GOPROXY 5 go mod详解 5.1 go mod命令 5.2 go.mod说明 5.2.1 依赖的版本 5.2.2 repla

  • C语言之选择分支语句详解

    目录 1.if-else语句 1.1 例子与总结 1.2 if与else的配对问题 1.3 if-else代码编写建议 2. switch (case)语句 2.1例子和总结 2.2 switch语句其他知识点 1.if-else语句 1.1 例子与总结 例子: ①只有一个if if (1 == a) { printf("yes\n"); } ②if-else语句 if (1 == a) { printf("yes\n"); } else { printfr(&qu

  • C语言中static和auto用法详解

    目录 static的第一种用法:定义为静态变量 static的第二种用法:有理说不清,直接代码见真知 auto的用法:直接代码见真知 总结 static的第一种用法:定义为静态变量 何为静态变量?存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化.就是只进行一次初始化.不理解?看代码! 代码见真知: #include<stdio.h> int main() { void fun(); //定义一个空函数 for(int i=0;i<3;i++) { fun();

  • C语言类的基本语法详解

    目录 1.由C语言的结构体进入到C++中的类 2.C++中如何定义类? 3.C++中实例化一个对象 4.C++类的访问限定及其封装 C++中的访问限定符 5.C++中类的作用域 6.成员变量和方法在类中是如何存储的? 总结 1.由C语言的结构体进入到C++中的类 我们在C语言中当需要定义多个变量的数据集合时,第一时间会想到使用结构体来进行定义,例如我们定义一个学生变量,包含姓名.年龄.性别等信息,代码示例如下: struct Student{ char name[12]; int age; ch

  • C语言数据结构哈希表详解

    /* * 程序名:hash.c,此程序演示哈希表的实现,数据元素单链表带头结点. * */ #include <stdio.h> #include <stdlib.h> #include <string.h> // 哈希表中数据元素的结构体. typedef struct Element { unsigned int key; // 关键字. int value; // 数据元素其它数据项,可以是任意数据类型. // char value[1001]; // 数据元素其

  • swift语言Codable 用法及原理详解

    目录 Codable Codable 的用法 JSON 和 模型的相互转换 解码(JSON Data -> Model): 编码(Model -> JSON Data): Codable 支持的数据类型 基础数据类型 Date 嵌套对象 枚举 自定义 CodingKeys Codable 的原理 Decodable 协议 Container 核心原理分析(Container <--> JSON) JSONDecoder 的解码过程 编译器帮我们做了什么? 默认值问题 属性包装器 @

  • go语言的变量定义示例详解

    目录 前言 定义单个变量 定义多个变量 定义相同类型的多个变量 变量的初始化 变量类型的省略 var关键字的省略(简短声明) 全局变量与局部变量 特别的变量名 未使用变量的限制 常量 前言 特别说明: 本文只适合新手学习 这篇文章带我们入门go语言的定义变量的方式,其实和javascript很相似,所以特意总结在此. 在go语言中,也有变量和常量两种,首先我们来看变量的定义,定义变量我们分为定义单个变量和多个变量. 本文知识点总结如下图所示: 定义单个变量 在定义单个变量中,我们通过var关键字

随机推荐