C语言的auto和register关键字怎么用

发布时间:2022-04-14 15:19:36 作者:iii
来源:亿速云 阅读:162

这篇文章主要介绍“C语言的auto和register关键字怎么用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言的auto和register关键字怎么用”文章能帮助大家解决问题。

一、关键字分类

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

C语言的auto和register关键字怎么用

C语言的auto和register关键字怎么用

二、补充内容

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

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;
}

C语言的auto和register关键字怎么用

四、最快的关键字 -- register

1、存储分级

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

2、寄存器

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

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

3、register修饰变量

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

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

既然用register修饰的变量可以提高效率,那么是不是所以的变量都最好用register修饰呢?答案当然不是的。因为寄存器的数量是有限的,大量使用register修饰反而会降低程序的运行效率。那么什么样的变量应该被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关键字怎么用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注亿速云行业资讯频道,小编每天都会为大家更新不同的知识点。

推荐阅读:
  1. C语言中的auto,register,volatile,extern,static,const
  2. c语言中auto有什么用

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c语言 auto register

上一篇:C#怎么获取指定目录下指定文件

下一篇:golang并发安全及锁怎么实现

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》