第6章 用函数实现模块化程序设计.ppt
文本预览下载声明
4)关于作用域和生存期的概念 对一个变量的属性可以从两个方面分析: 作用域:如果一个变量在某个文件或函数范围内是有效的,就称该范围为该变量的作用域 生存期:如果一个变量值在某一时刻是存在的,则认为这一时刻属于该变量的生存期 作用域是从空间的角度,生存期是从时间的角度 二者有联系但不是同一回事 int a; int main( ) { …f2( );…f1( );… } void f1( ) { auto int b; … f2( ); … } void f2( ) { static int c; …… } a的作用域 b的作用域 c的作用域 文件file1.c a生存期 b生存期 c生存期 main f2 f1 main f2 f1 main 程序执行过程 变量存储类别 函 数 内 函 数 外 作用域 存在性 作用域 存在性 自动变量和寄存器变量 ∨ ∨ ╳ ╳ 静态局部变量 ∨ ∨ ╳ ∨ 静态外部变量 ∨ ∨ ∨(只限本文件) ∨ 外部变量 ∨ ∨ ∨ ∨ 各种类型变量的作用域和存在性的情况 5)static对局部变量和全局变量的作用不同 局部变量使变量由动态存储方式改变为静态存储方式 全局变量使变量局部化(局部于本文件),但仍为静态存储方式 从作用域角度看,凡有static声明的,其作用域都是局限的,或者是局限于本函数内(静态局部变量),或者局限于本文件内(静态外部变量) 6.10 关于变量的声明和定义 一般为了叙述方便,把建立存储空间的变量声明称定义,而把不需要建立存储空间的声明称为声明 在函数中出现的对变量的声明(除了用extern声明的以外)都是定义 在函数中对其他函数的声明不是函数的定义 例 考察静态局部变量的值。 #include stdio.h int main() { int f(int); int a=2,i; for(i=0;i3;i++) printf(“%d\n”,f(a)); return 0; } int f(int a) { auto int b=0; static int c=3; b=b+1; c=c+1; return(a+b+c); } 调用三次 每调用一次,开辟新a和b,但c不是 例 考察静态局部变量的值。 #include stdio.h int main() { int f(int); int a=2,i; for(i=0;i3;i++) printf(“%d\n”,f(a)); return 0; } int f(int a) { auto int b=0; static int c=3; b=b+1; c=c+1; return(a+b+c); } 0 3 b c 第一次调用开始 例 考察静态局部变量的值。 #include stdio.h int main() { int f(int); int a=2,i; for(i=0;i3;i++) printf(“%d\n”,f(a)); return 0; } int f(int a) { auto int b=0; static int c=3; b=b+1; c=c+1; return(a+b+c); } 0 3 b c 第一次调用期间 1 4 例 考察静态局部变量的值。 #include stdio.h int main() { int f(int); int a=2,i; for(i=0;i3;i++) printf(“%d\n”,f(a)); return 0; } int f(int a) { auto int b=0; static int c=3; b=b+1; c=c+1; return(a+b+c); } b c 第一次调用结束 1 4 7 例 考察静态局部变量的值。 #include stdio.h int main() { int f(int); int a=2,i; for(i=0;i3;i++) printf(“%d\n”,f(a)); return 0; } int f(int
显示全部