在函数体或复合语句中声明的变量为局部变量。函数中的形式变量也是局部变量。在所有函数体外定义的变量称为外部变量(或全局变量)。
局部变量
局部变量具有以下性质:
- 自动存储期限。变量的存储期限是指从变量开始占用存储单元到存储单元被回收之间的程序。程序执行时,在函数体或复合语句中变量定义处,为变量自动分配存储单元,到函数返回(或复合语句结束)时,收回分配的存储单元。
- 程序块作用域。变量的作用域是可以访问或引用变量的代码段。局部变量的作用域是从函数或复合语句的变量声明部分开始,到函数返回或复合语句结束时止。由于局部变量对于函数(或复合语句)外的代码不可见,因此可以在那里使用相同的变量名。当同名的两个变量位于内外层且外层变量处于内层变量声明前时,进入内层变量声明时,“暂时”隐藏外层变量的声明,使得变量名称标识符表示内层变量,在内层程序块结束时恢复变量名称标识符表示外层变量。
/***************************************
* local_variable.c *
* *
* C语言中的局部变量 *
***************************************/
#include <stdio.h>
int hisLog2(int n)
{
/*局部变量*/
int log = 0;
/*形式变量n也是函数内的局部变量*/
while (n > 1)
{
n /= 2;
log++;
}
return log;
}
int main()
{
/*局部变量*/
unsigned int n = 1;
printf("输入一个正整数: ");
scanf("%u", &n);
printf("log2(%u) = %d", n, hisLog2(n));
return 0;
}
带有static
定义的变量具有静态存储期限,在程序执行期间永久地占用存储单元,在函数返回或复合语句结束时不丢失原有的值。然而它还是只有程序块作用域,对函数或复合语句外代码具有不可见性。
/**************************************
* static_local_variable.c *
* *
* C语言中的静态局部变量 *
**************************************/
#include <stdio.h>
void addA()
{
static int a = 0;
a++;
printf("a = %d\n", a);
}
int main()
{
int i = 0;
for(i = 0; i < 10; i++)
{
static int b = 0;
printf("b = %d,", ++b);
addA();
}
return 0;
}
外部变量
外部变量具有以下性质:
- 静态存储期限。
- 文件作用域。从变量声明的点开始,一直到闭合文件的结尾。当使用
#include
包含一个外部变量的文件时,外部变量的作用域扩展到该文件末尾。
外部变量使得程序的耦合性增强,修改外部变量会影响程序的其他部分,难以维护和重用。
/**************************************
* another_file.c *
* *
* 定义全局变量的某个文件 *
**************************************/
int a = 0;
/**************************************
* global_variable.c *
* *
* C语言中的全局变量 *
**************************************/
#include <stdio.h>
#include "another_file.c"
int b = 0;
void addB()
{
b += 2;
}
void setA(int n)
{
a = n;
}
int main()
{
setA(10);
printf("Now A is %d\n", a);
addB();
printf("Now B is %d\n", b);
return 0;
}
参考文献
- K.N. King 著,吕秀峰 译. C语言程序设计-现代方法. 人民邮电出版社