首页 > 代码库 > [C++]变量存储类别

[C++]变量存储类别

C++中共有四种存储类别标识符:auto/static/register/extern

1.auto

函数或分程序内定义的变量(包括形参)可以定义为auto(自动变量)。如果不指定存储类别,则隐式定义为auto。

例如,函数类有如下定义:

  auto int x , y ; 

等价于:

  int x , y ;

2.static

除了形参,可以将局部变量和全局变量定义为静态变量。用static标识符。

static int a;//a是全局静态变量

f()

{static int b = 1;}//b是局部静态变量

与auto不同,static变量的生存期是程序开始运行到运行结束(auto变量生存期是函数调用结束)。

若定义静态变量时没有对其赋初值,系统自动赋初值0;若赋初值,则仅在编译时赋初值一次,程序运行后不再给变量赋初值。当上一次调用局部静态变量所在的函数时,该变量的值继续有效(为上次函数调用结束时保留的值)。

3.extern

在函数外定义的变量如果没有用static声明,则是extern外部变量。外部变量只能隐式定义为extern,不能显示定义。

对外部变量声明时,系统不分配存储空间。

#include <iostream>using namespace std;int x = 2 , y = 2 ;//定义外部变量void f1(){    extern char c1 , c2 ;//声明外部变量    cin>>c1>>c2;}char c1 , c2 ;//定义外部变量int main(){    int m , n ;    f1();    cout <<c1<<"+"<<c2<<"="<<x+y<< endl;    return 0;}

结果是这样:

技术分享

注意,如果把extern去掉了,再输入xy,回车,会出现:

技术分享

因为c1,c2的作用域只在f1函数里面。如果不用extern,想达到第一幅的效果,只要把

char c1 , c2 ;//定义外部变量

这句拿到f1()前面就行了。

4.register

寄存器变量的值保存在CPU的寄存器中,读写速度更快。随着计算机硬件性能提高,现在寄存器变量使用得比较少了。

[C++]变量存储类别