C++ 中静态、自动、全局和局部变量之间的区别

c++programmingobject oriented programming

这里有两个独立的概念 −

  • 作用域,决定了名称可以在何处访问 - 全局和局部
  • 存储持续时间,决定了变量的创建和销毁时间 - 静态和自动

作用域

局部变量只能由该函数或代码块内的语句使用。函数本身并不知道局部变量。

示例

#include <iostream>
using namespace std;

int main () {
   // 局部变量声明:
   int a, b;
   int c;

   // 实际初始化
   a = 10;
   b = 20;
   c = a + b;

   cout << c;
   return 0;
}

这将给出输出 −

输出

30

全局变量在所有函数之外定义,通常在程序顶部。全局变量将在程序的整个生命周期内保持其值。任何函数都可以访问全局变量。

示例

#include <iostream>
using namespace std;

// 全局变量声明:
int g;

int main () {
    // 局部变量声明:
    int a, b;
    
    // 实际初始化
    a = 10;
    b = 20;
    g = a + b;
    
    cout << g;
    return 0;
}

这将给出输出 −

输出

30

存储期限

自动变量是局部变量,其生存期在执行离开其作用域时结束,并在重新进入作用域时重新创建。

示例

for (int i =0 0; i < 5; ++i) {
    int n = 0;
    printf("%d ", ++n); // 打印 1 1 1 1 1 - 先前的值丢失
}

静态变量的生存期持续到程序结束。如果它们是局部变量,那么当执行离开其范围时,它们的值将保持不变。

for (int i = 0; i < 5; ++i) {
    static int n = 0;
    printf("%d ", ++n); // 打印 1 2 3 4 5 - 值保持不变
}

请注意,除了静态存储持续时间外,static 关键字还有多种含义。此外,在 C++ 中,auto 关键字不再表示自动存储持续时间;它现在表示从变量的初始化程序推导出来的自动类型。


相关文章