
1.变量作用域的定义
变量作用域:每个变量的作用域从定义它的位置开始,到包含它的程序模块结束。
2.变量作用域的分类
对变量作用域的讨论同样适应于常量和数组。
分类:全局、文件、函数、块
全局作用域:在所有函数定义之外定义的、使用或省略extern保留字的变量具有全局作用域。全局作用域变量称为全局变量,若没有被初始化,则自动被赋初值0。
文件作用域:在所有函数定义之外,使用static保留字定义的变量具有文件作用域。若文件作用域变量没有被初始化,则也自动被赋初值为0。
int x=10;//此语句若在所有函数定义之外,则x为全局变量
static int x=10;//此语句若在所有函数定义之外,则x为文件域变量
函数作用域:就是函数定义中参数的作用域。在整个函数体中的任何位置,都可以使用参数表中定义的任何参数。
语句中使用的语句标号也具有函数作用域。语句标号只在本函数内有效,离开本函数则无效。
局部作用域又称为块作用域。在一条复合语句内定义的变量具有局部作用域,作用域范围从定义点开始到复合语句结束。
具有局部作用域的变量称为局部变量,若局部变量没有被赋初值,则其初值是不确定的。
3.定义各种作用域变量的简单例子
#include<stdio.h>
#define NN 15//文件域
int x=3,y;//全局域,y的初值为0
char str[80];//全局域,每个元素的初值为'\0'
static double a,b;//文件域,每个变量的初值为0.0
const int MM=20;//全局域
static const int MAX=100;//文件域
void ff(int x) {…}// ff()为全局域,x为函数域
void main() {
int i,j,k;//每个变量都是局部于主函数体的变量
…
}
注意:在任一条复合语句内,变量定义语句序列在前,处理语句序列在后,不允许它们之间的交叉。
{int x=0; x=x+20; int y=x+10;}//错误的语句序列
{int x=0; x=x+20; int y=x+10;}//正确的语句序列
4.自动变量和静态变量
在一个函数体内,若在变量定义语句的开始使用auto则为自动变量,使用static则为静态变量,缺省情况下则为自动变量。
对于静态变量,若没有被赋初值,则被自动赋予初值0,对于自动变量,若没有被赋初值,则它的值是不确定的,是不可利用的。
每次调用函数时,都对自动变量重新分配存储空间;对于静态变量,只在第1次调用时分配存储空间并进行初始化,再次调用时将使用静态变量的原有存储空间和值。例如:
void ff() {
int z=0;//自动变量
static int k;//静态变量
z+=5;
k+=5;
}
int i; for(i=1; i<=5; i++) ff();
执行for循环,k的值变化为5、10、15、20、25。