C++:static/extern/auto/register关键字

这里写目录标题

1. static

  1. 静态局部变量
    函数中局部变量的值调用结束后不消失,保持原值
    即占用的存储单元不释放,下一次调用该函数时,该变量保留上一次函数调用结束时的数
#include "iostream"
#include <string.h>

using namespace std;

void f1()
{
    int static i = 3;
    cout << i;
    i = i + 1;
}

int main()
{
    f1(); // 3
    f1(); // 4
    f1(); // 5
}

说明:
1) 静态局部变量,在静态存储区内分配存储单元,程序整个运行期间都不释放
2)静态局部变量,赋初值是在编译时进行,只赋值一次
以后每次调用函数时不再重新赋初值,只是保留上次函数调用结束时候的值
3)静态局部变量,不赋初值。编译时自动赋初值0(数值变量),或空字符(字符型变量)。
4)静态局部变量,虽然调用后任然存在,其它函数不能引用,在其它函数不可见

  1. 静态外部变量
    定义外部变量时加一个static声明
    希望某些外部只限于被本文件引用,而不能被其他文件引用
using namespace std; //file 1
extern int i;
int main()
{
cout<<i;
}
static int i = 3; //file 2 

2. extern

  1. 一个文件内声明全局变量
    如果外部变量不在文件开头定义,有效范围只限于定义处到文件终了
    定义点之前函数想引用全局变量,引用之前用关键字extern对该变量做外部声明,
    表示该变量是一个将在下面定义的全局变量
extern int a;
int main(){
    //变量定义之前要使用该变量    
    cout << a;    
    //放这里不行,好像是因为要在函数外部定义
}
int a = 10;
//用于函数定义 表示全局可见的
//用于变量 表示在其他地方定义
  1. 多文件程序中声明外部变量
    问题:一个文件想引用另一个文件中已定义的外部变量x。
    做法:一个文件中定义外部变量x,另一文件中用extern对x做外部声明。
extern int x

编译系统由此知道x是一个已在别处定的外部变量,先在本文件中找有无外部变量x。如果有,则将其作用域拓展到本行,还是和“一个文件内声明全局变量”一样。
如果本文件中没有,则程序连接时候从其他文件中找有无x,如果有,则吧另一文件中定义的外部变量x的作用域拓展到本文件。
file1

int i = 3;

file2

extern int i;
int main()
{
	cout<<i;
}

虽然extern拓展全局变量作用于为设计带来方便,但是要小心,在执行一个文件中的函数时,可能会改变了该全局变量的值

3. auto

会根据变量初值自动选择变量类型
auto i;

4. register

int main()
{
	register int i = 3;
	cout<<i;
}

一般情况,变量存储在内存中。程序用到哪一个变量值时,控制器发出指令将内存中该变量值送到CPU运算器。
经运算器运算,如果需要存数,再从运算器将数据运到内存存放。

如果一些变量使用频繁,存取变量耗时长,为提高执行效率,c++允许将局部变量值存放在CPU寄存器中。
需要时,直接从寄存器取出参加运算,不必到内存中取,寄存器存取速度远高于对内存存取速速度,用关键字register声明。

定义的寄存器变量对编译系统只是建议性的(不是强制性),当今优化编译系统能够识别使用频繁的变量,从而自动将这些变量放在寄存器中,而不需要程序设计者指定。
实际上register是不必要的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值