C语言 auto和register关键字

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

一、关键字分类

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内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

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

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

  • C语言 auto和register关键字

    目录 一.关键字分类 二.补充内容 1.变量的分类 2.变量的作用域与生命周期 三.最宽宏大量的关键字 -- auto 四.最快的关键字 -- register 1.存储分级 2.寄存器 3.register修饰变量 一.关键字分类 C语言一共多少个关键字呢?一般的书上,都是32个(包括本书),但是这个都是C90(C89)的标准.其实C99后又新增了5个关键字.不过,目前主流的编译器,对C99支持的并不好,我们后面默认情况,使用C90,即,认为32个 二.补充内容 在正式开始讲解关键字之前,我们

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

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

  • C语言数据类型与sizeof关键字

    目录 一.前言 二.数据类型 1.数据类型有哪些 2.为什么要有数据类型 3.如何看待数据类型 三.sizeof – 计算不同类型变量开辟空间的大小 1.内置类型开辟的空间大小 2.自定义类型开辟的空间大小 3.指针类型开辟的空间大小 4.空类型开辟的空间大小 四.对sizeof 的进一步理解 1.sizeof 为什么不是函数 2.sizeof 的其他使用 一.前言 大家好,欢迎来到C语言深度解析专栏—C语言关键字详解第三篇,在本篇中我们将会介绍C语言当中的数据类型,并由此引出C语言当中的另外一

  • C语言关键字auto与register及static专项详解

    目录 1.auto 2.register 3.static 1.auto 在解释 auto 之前,先来了解一下什么是局部变量. 在很多印象中,对局部变量的描述是:函数内定义的变量称为局部变量.并且下面这段代码也很好的解释了这句话: #include <stdio.h> void print() { int a = 10; printf("%d", a); } int main() { print(); printf("%d", a); return 0;

  • C语言简明介绍常见关键字的用法

    目录 1.关键字 2.常见关键字 1.关键字 关键字是C语言提供的,不能自己创建关键字: 关键字不能用作变量名,eg:int char:这样的写法是不可取的. 2.常见关键字 auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef

  • 探讨register关键字在c语言和c++中的差异

    在c++中: (1)register 关键字无法在全局中定义变量,否则会被提示为不正确的存储类. (2)register 关键字在局部作用域中声明时,可以用 & 操作符取地址,一旦使用了取地址操作符,被定义的变量会强制存放在内存中. 在c中: (1)register 关键字可以在全局中定义变量,当对其变量使用 & 操作符时,只是警告"有坏的存储类". (2)register 关键字可以在局部作用域中声明,但这样就无法对其使用 & 操作符.否则编译不通过. 建议不

  • 详解C语言正确使用extern关键字

    利用关键字extern,可以在一个文件中引用另一个文件中定义的变量或者函数,下面就结合具体的实例,分类说明一下. 一.引用同一个文件中的变量 #include<stdio.h> int func(); int main() { func(); //1 printf("%d",num); //2 return 0; } int num = 3; int func() { printf("%d\n",num); } 如果按照这个顺序,变量 num在main函

  • 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

  • C语言详细分析讲解关键字enum与sizeof及typedef的用法

    目录 一.枚举类型的使用方法 二.sizeof 关键字的用法 三.typedef 的意义 四.小结 一.枚举类型的使用方法 enum 是 C 语言中的一种自定义类型 enum 值是可以根据需要自定义的整型值 第一个定义的 enum 值默认为 0 默认情况下的 enum 值是在前一个定义值的基础上加 1 enum 类型的变量只能取定义时的离散值 enum 中定义的值是C语言中真正意义上的常量 在工程中 enum 多用于定义整型常量 下面看一段 enum 的使用代码吧: #include<stdio

  • C语言详细分析讲解关键字const与volatile的用法

    目录 一.const 只读变量 二.const 全局变量的分歧 三.const 的本质 四.const 修饰函数参数和返回值 五.volatile 解析 六.小结 一.const 只读变量 const 修饰的变量是只读的,本质还是变量 const 修饰的局部变量在栈上分配空间 const 修饰的全局变量在全局数据区分配空间 const 只在编译期有用,在运行期无用 const 修饰的变量不是真的常量,它只是告诉编译器该变量不能出现在赋值符号的左边. 二.const 全局变量的分歧 在现代C语言编

随机推荐