学习目标:
理解变量作用域的概念
理解变量生命周期的概念
重点:
熟练掌握不同定义位置对变量作用域的影响
熟练掌握不同存储类型对变量生命周期的影响
难点:
合理设计变量的定义位置来获得所需的作用域
合理选择变量的存储类型来获得所需的生命周期
引言:
自定义函数引出了两个问题:
第一,每一个变量在什么范围内起作用
第二,每一个变量何时生成、何时消失
变量的作用域:在程序哪一部分可见并发挥作用
变量的生命周期:变量所占用的空间从创建到撤消的时间。
二者的关系:一个变量如果不在其生命周期,肯定无作用域可言;如果在
其生命周期,也未必一直起作用。
一、变量的作用域
1.变量的作用域取决于变量定义的位置
2.有3种位置:
1)函数体外:外部(全局)变量,定义点到程序结束,但去掉同名局部量范围
2)函数体内:作用范围为本函数体内
3)函数语句块内:作用范围仅限于本语句块内
例1:找出2-100之间所有的质数,并统计个数。
#include <stdio.h>
#include <math.h>
int count;
int judgePrime(int n);
int main()
{ …
for (i= 2; i< 100; i++)
if (judgePrime(i)) /
{
printf("%d ", i);
count++;
}
…
}

二、变量的生命周期
1.变量的生命周期取决于变量的存储类型
2.有4种不同的存储类型:

例2:利用静态局部变量求解从1到5的阶乘
#include<stdio.h>
int fun(int n)
{
static int f= 1; /*定义静态局部变量f*/
f=f*n; /*求n的阶乘f*/
return f; /*返回阶乘值*/
}
int main()
{ int i; /*定义局部变量i*/
for(i =1;i <=5;i++) /*循环,依次求1 到5的阶乘*/
printf(“%d != %d\ n" , i, fun(i));
return 0;
}
注意:静态局部变量的特点
1)编译阶段在静态存储区分配存储空间,并且一直占用到程序结束。
2)定义位置在函数内部,仍然是局部变量,作用域仅限于本函数,仅在本函数被调用时才能被访问。
3)第一次进入函数时被初始化,若未指定初值,将自动初始化为0。
4)第二次及以后进入函数时不再初始化,而从“休眠”状态“苏醒”,获取之前的值。每次退出函数时就进入“休眠”状态。
三、讨论题
1. 对例1分别作以下几种修改,观察程序编译、运行结果,并分析原因。
①在judgePrime函数体内增加一语句:
printf("count=%d\n",count);
②随后,在main函数体内增加变量定义:
int count=0;
2.对例2分别作以下几种修改,观察程序编译、运行结果,并分析原因。
①将函数fun中的static int f= 1;改为int f= 1;
② f恢复成静态局部变量,将main函数中的for(i=1;i<=5;i++)printf("%d != %d\n" , i , fun(i)); 改为printf("%d!= %d\n" , 5, fun(5));,那么输出结果是5的正确阶乘吗?
③如何在main函数中稍加修改,达到求sum=1!+2!+3!+4!+5!的效果。

