C 变量作用域

本文介绍了 C 语言中的局部变量和全局变量的作用域和生命周期,还介绍了静态变量和寄存器变量。

在 C 语言中,不同的变量可能有的作用域和生命周期,了解这些对 C 语言编程至关重要。

C 语言编程中的每个变量都有两个属性:类型和存储类。

类型是指变量的数据类型。并且,存储类决定了变量的范围、可见性和生命周期。

有 4 种类型的存储类:

  • 自动的
  • 外部的
  • 静态的
  • 寄存器

局部变量

在块内声明的变量是自动或局部变量。局部变量只存在于声明它的块内。

让我们举个例子。

#include <stdio.h>

int main(void) {

  for (int i = 0; i < 5; ++i) {
     printf("C programming");
  }

 // 错误: 此处,变量 i 未声明
  printf("%d", i);
  return 0;
}

当你运行上面的程序时,你会得到一个错误 “未声明的标识符 i”. 这是因为 ifor 循环块内声明。在 for 块之外,它是未声明的。

让我们再举一个例子。

int main() {
    int n1; // n1 是 main 函数中的局部变量
}

void func() {
   int n2;  // n2 是 func 函数中的局部变量

在上面的例子中, n1main() 函数中的局部变量,n2func() 函数中的局部变量。

这意味着您无法在 func() 函数中访问 n1 变量,因为它只存在于 main() 函数内部。 同样,您无法在 main() 函数中访问 n2 变量, 因为它只存在于 func() 函数内部。

全局变量

在所有函数之外声明的变量称为外部变量或全局变量。它们可以从程序内的任何函数访问。

示例 1:全局变量

#include <stdio.h>
void display();

int n = 5;  // 全局变量

int main()
{
    ++n;
    display();
    return 0;
}

void display()
{
    ++n;
    printf("n = %d", n);
}

输出

n = 7

假设在 file1 文件中声明了一个全局变量。如果您在另一个文件 file2 中使用该变量,编译器会报错。为了解决这个问题,在 file2 文件中使用关键字 extern 表明这个外部变量是在另一个文件中声明的。

寄存器变量

register 关键字用于声明寄存器变量。寄存器变量应该比局部变量更快。

但是,现代编译器非常擅长代码优化,使用寄存器变量使您的程序更快的优势正在变小。

除非您的应用程序需要运行在嵌入式系统,否则一般不会使用寄存器变量。

静态变量

使用 static 关键字声明静态变量,静态变量的值只被初始化一次。例如;

static int i;

示例 2:静态变量

#include <stdio.h>
void display();

int main()
{
    display();
    display();
}
void display()
{
    static int c = 1;
    c += 5;
    printf("%d  ",c);
}

输出

6
11

在第一次函数调用期间,静态变量 c 被初始化为 1。执行 c += 5; 语句之后,它的值增加了 5 变成了 6。因此 6 被打印出来。

在第二次函数调用期间,静态变量 c 不会再次被初始化为 1。执行 c += 5; 语句之后,它的值增加了 5 变成了 11。因此 11 被打印出来。