全站搜索未启用
跳到主要内容

文本三:变量的作用域

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。

最后修改: 2019年09月26日 Thursday 19:04