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”. 这是因为 i
在 for
循环块内声明。在 for
块之外,它是未声明的。
让我们再举一个例子。
int main() {
int n1; // n1 是 main 函数中的局部变量
}
void func() {
int n2; // n2 是 func 函数中的局部变量
在上面的例子中, n1
是 main()
函数中的局部变量,n2
是 func()
函数中的局部变量。
这意味着您无法在 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
被打印出来。