目录

  • 1 计算机概述
    • 1.1 计算机简介
    • 1.2 计算机系统
    • 1.3 数值在计算机中的表示
  • 2 C语言概述
    • 2.1 C语言发展及特点
    • 2.2 C语言程序的运行步骤和开发环境
    • 2.3 简单的C语言程序
  • 3 C语言基础
    • 3.1 变量、常量及数据类型
    • 3.2 运算符和表达式
    • 3.3 输入、输出
  • 4 选择结构
    • 4.1 计算机编程和算法
    • 4.2 if语句
    • 4.3 if嵌套和if多分支
    • 4.4 switch语句
  • 5 循环结构
    • 5.1 while语句和do...while语句
    • 5.2 for语句
    • 5.3 break语句和continue语句
    • 5.4 goto语句构成的循环
    • 5.5 嵌套循环结构
    • 5.6 程序设计举例
  • 6 函数
    • 6.1 函数的定义与调用
    • 6.2 函数的嵌套调用和递归调用
    • 6.3 作用域和生命周期
    • 6.4 章节小结与测试
  • 7 数组
    • 7.1 一维数组及应用
    • 7.2 二维数组及应用
    • 7.3 字符数组
    • 7.4 数组作为函数参数
    • 7.5 章节小结与测试
  • 8 指针
    • 8.1 指针变量
    • 8.2 指针与数组
    • 8.3 指针的多种形态
  • 9 字符串
    • 9.1 字符串概念及输入输出
    • 9.2 字符串函数
    • 9.3 指针与字符串
    • 9.4 章节小结与测试
  • 10 编译预处理
    • 10.1 宏定义
    • 10.2 文件包含
    • 10.3 条件编译
  • 11 结构体、共用体和用户定义类型
    • 11.1 结构体类型变量
    • 11.2 结构体类型数组与指针
    • 11.3 结构体与函数
    • 11.4 用指针处理链表
    • 11.5 共用体
  • 12 位运算
    • 12.1 位运算的概念和运算规则
  • 13 文件
    • 13.1 C文件概述
    • 13.2 文件的打开与关闭
    • 13.3 文件读写
    • 13.4 位置指针的定位
作用域和生命周期

学习目标:

理解变量作用域的概念

理解变量生命周期的概念

重点:

熟练掌握不同定义位置对变量作用域的影响

熟练掌握不同存储类型对变量生命周期的影响

难点:

合理设计变量的定义位置来获得所需的作用域

合理选择变量的存储类型来获得所需的生命周期


引言


   自定义函数引出了两个问题:

第一,每一个变量在什么范围内起作用

第二,每一个变量何时生成、何时消失


变量的作用域:在程序哪一部分可见并发挥作用

变量的生命周期:变量所占用的空间从创建到撤消的时间。

二者的关系:一个变量如果不在其生命周期,肯定无作用域可言;如果在

其生命周期,也未必一直起作用。

 

一、变量的作用域

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:利用静态局部变量求解从15的阶乘

#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!的效果。