广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言 auto和register关键字
  • 620
分享到

C语言 auto和register关键字

2024-04-02 19:04:59 620人浏览 薄情痞子
摘要

目录一、关键字分类二、补充内容1、变量的分类2、变量的作用域与生命周期三、最宽宏大量的关键字 -- auto四、最快的关键字 -- reGISter1、存储分级2、寄存器3、regi

一、关键字分类

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

二、补充内容

在正式开始讲解关键字之前,我们需要了解下面这些基本概念

1、变量的分类

变量分为全局变量和局部变量

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

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

注:代码块 — 在函数中,用{}括起来的区域,就叫做代码块,代码块可以嵌套

2、变量的作用域与生命周期

作用域概念:指该变量可以被正常访问的代码区域

全局变量的作用域:在整个程序运行期间都有效

局部变量的作用域:只在局部变量所在的代码块内有效

生命周期概念:指的是该变量从定义开辟空间到释放的时间范围,所谓的释放,指的是曾经开辟的空间”被释放“。

全局变量的生命周期:定义完成之后,程序运行的整个生命周期内,该变量一直都有效

局部变量的生命周期:进入代码块,形成局部变量[开辟空间],退出代码块,"释放"局部变量

#include<stdio.h>
int g_val = 10;   //g_val 在所有函数外部定义,是全局变量
int main()
{
    int a = 20;    //a 在main函数内部定义,是局部变量
    printf("%d\n", g_val);
    printf("%d\n", a);
    return 0;
}
#include<stdio.h>
int g_val = 100;
int main()
{
    int x = 10;
    if (x == 10)
    {
        int y = 20;
        pritnf("%d %d", x, y);   //可以
    }
    pritnf("%d %d", x, y);  //报错,y只能在 if 代码块内部被访问
}
#include <stdio.h>
int g_x = 100; //全局变量
void show()
{
    printf("show: 全局: %d\n", g_x); //在任何代码块中都可以被访问
}
int main()
{
    show();
    printf("main: 全局: %d\n", g_x); //在任何代码块中都可以被访问,甚至被修改
    return 0;
}
#include<stdio.h>
int g_x = 100; //全局变量
int main()
{
    int g_x = 10; //局部变量,与全局同名
        printf("g_x:%d\n", g_x); //输出的是局部,也就是局部和全部同名的时候,优先局部。
 
    return 0;
}

总结:作用域是空间上的概念,表示该变量能够被有效访问或使用的区域

生命周期是时间上的概念,表示该变量空间什么时候被开辟,什么时候被释放

当局部变量和全局变量重复出现时,局部变量优先(就近原则) 

三、最宽宏大量的关键字 -- auto

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

2、用法:auto关键字比较古老,一般我们在定义变量的时候直接省略即可

3、总结:auto用来修饰局部变量,表示该局部变量的生命周期和作用域只在该代码块内有效,可以省略,不能用来修饰全局变量。

#include<stdio.h>
auto int b = 10;  //报错,auto 不能用来修饰全局变量
int main()
{
    auto int a = 30; // 等价于 int a = 30;
}

四、最快的关键字 -- register

1、存储分级

在计算机内部,越靠近CPU的存储单元的运行速度越快,但其相对单位制造成本也越高,越远离CPU的存储单元运行速度越慢,单位造价越低,为了以最小的成本,达到最大的CPU运行效率,出现了存储分级的办法。

2、寄存器

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

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

3、register修饰变量

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

register修饰变量提高效率的本质:将变量放入寄存器中,使CPU可以直接对该数据进行操作,而不需要从内存中对其进行读取。

既然用register修饰的变量可以提高效率,那么是不是所以的变量都最好用register修饰呢?答案当然不是的。因为寄存器的数量是有限的,大量使用register修饰反而会降低程序的运行效率。那么什么样的变量应该被register修饰呢?

  • (1)局部的(全局会导致CPU寄存器被长时间占用)
  • (2)不会被写入的(对数据进行写入需要将数据重新加载进内存,这样也就失去了把数据放进寄存器当中的意义)
  • (3)需要被高频读取的(直接从寄存器中对该数据进行读取,提高效率)

注意:

  • (1)被register修饰的变量,不能取地址(因为该变量已经被放在寄存区中,而地址是内存相关的概念)
  • (2)register只是一个建议性的关键字,建议计算机将该变量放入内存之中,不是强制性的,也就是说,虽然一个变量已经被register修饰了,但是该变量还是可能被继续放在内存当中
  • (3)如果要使用register,请不要大量使用,因为寄存器数量有限
#include <stdio.h>
int main()
{
    register int a = 0;
    printf("&a = %p\n", &a);
    //编译器报错:错误 1 error C2103: 寄存器变量上的“&”
    //注意,这里不是所有的编译器都报错,目前我们的vs2022是报错的。
    return 0;
}

到此这篇关于C语言 auto和register关键字的文章就介绍到这了,更多相关C语言auto、register内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言 auto和register关键字

本文链接: https://www.lsjlt.com/news/145989.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言 auto和register关键字
    目录一、关键字分类二、补充内容1、变量的分类2、变量的作用域与生命周期三、最宽宏大量的关键字 -- auto四、最快的关键字 -- register1、存储分级2、寄存器3、regi...
    99+
    2022-11-13
  • C语言的auto和register关键字怎么用
    这篇文章主要介绍“C语言的auto和register关键字怎么用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言的auto和register关键字怎么用”文章能帮助大家解决问题。一、关键字分类C...
    99+
    2023-06-30
  • C语言关键字auto register怎么使用
    这篇文章主要介绍“C语言关键字auto register怎么使用”,在日常操作中,相信很多人在C语言关键字auto register怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C...
    99+
    2023-06-26
  • C语言关键字auto与register及static专项详解
    目录1.auto2.register3.static1.auto 在解释 auto 之前,先来了解一下什么是局部变量。 在很多印象中,对局部变量的描述是:函数内定义的变量称为局部变量...
    99+
    2022-11-13
  • c语言register关键字的作用是什么
    C语言中的register关键字用于向编译器建议将变量存储在寄存器中,以便更快地访问。它是一种优化技术,用于提高程序的执行速度。使用...
    99+
    2023-09-16
    c语言
  • c语言auto和register的区别是什么
    在C语言中,auto和register是两个关键字,用于声明局部变量。1. auto关键字:auto是默认的存储类别关键字,它用于声...
    99+
    2023-10-12
    c语言
  • C语言关键字(三)
    这篇文件继续讲解C语言关键字想问大家一个问题,什么是声明什么是定义?举个例子:A)int i;B)extern int i;(关于extern,后面解释)哪个是定义?哪个是声明?或者都是定义或者都是声明?什么是定义:所谓的定义就是(编译器)...
    99+
    2023-06-03
  • C++中register关键字举例详解
    目录register 简介:register 的作用:补充知识:register函数的限制总结register 简介: register 就像是汉语和英语中的形容词(不要问为什么只有...
    99+
    2023-03-08
    cregister关键字 c++ register关键字 c++中的关键字
  • C++中register关键字怎么使用
    本篇内容介绍了“C++中register关键字怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!register 简介:register...
    99+
    2023-07-05
  • C++中auto关键字的使用
    前提引入 1.类型名,在绝大多数编程时,我们都会引入类型来定义一个我们需要的数据。 类型众多,偶尔我们会遇见一串类型名,使用起来无比复杂。存在拼写错误,含义不明确导致出错的问题。 列...
    99+
    2023-05-15
    C++ auto关键字 C++ auto
  • C语言中auto,register,static,const,volatile的区别详细解析
    1)auto这个关键字用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。这个关键字不怎么多写,因为所有的变...
    99+
    2022-11-15
    register static const volatile
  • C++中auto关键字怎么使用
    今天小编给大家分享一下C++中auto关键字怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前提引入类型名,在绝大多数...
    99+
    2023-07-06
  • C语言Static 关键字解析
    目录01简述02static关键字作用01简述 static关键字在嵌入式C语言当中很简单,它有三个作用: 作用一:在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变...
    99+
    2022-11-13
  • c语言关键字有多少
    今天小编给大家分享一下c语言关键字有多少的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。C语言的关键字共有32个,根据关键字的...
    99+
    2023-07-04
  • C 语言基础之C语言的常见关键字
    目录​1、auto 2、register 3、signed和unsigned 4、typedef 5、extern 6、拓展首先我们简单的和这些关键字见见面(被高亮的关键...
    99+
    2022-11-12
  • C语言的关键字有哪些
    这篇“C语言的关键字有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言的关键字有哪些”文章吧。第一类:数据类型关键字...
    99+
    2023-06-16
  • C语言关键字总结解析
    C语言关键字总结 1.关键字变更历史 1999年12月16日,ISO推出了C99标准,该标准新增了5个C语言关键字: inline restrict _Bool _Complex _...
    99+
    2022-11-12
  • go是c语言中关键字吗
    go不是c语言的关键字,goto才是是c语言的关键字。goto语句被称为无条件转移语句,允许把控制无条件转移到同一函数内的被标记的语句;语法“goto label;...label: statement;”,其中label可以是任何除C关键...
    99+
    2023-05-14
    关键字 go语言 Golang
  • C语言关键字之autoregister详解
    目录一:auto作用域生命周期auto二:register总结:一:auto 在学习关键字auto之前我们需要先了解两个概念:作用域和生命周期。 作用域 作用域(scope)是程序设...
    99+
    2022-11-12
  • C语言中的关键字总结
    本篇内容介绍了“C语言中的关键字总结”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.关键字变更历史1999年12月16日,ISO推出了C9...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作