C语言关键字之auto register详解

2022-07-18,,,,

目录
  • 一: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关键字的理解是使用。

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

      《C语言关键字之auto register详解.doc》

      下载本文的Word格式文档,以方便收藏与打印。