变量作用域
2.3.3 变量的作用域
1、作用域和生存期的基本概念 变量的作用域 即变量的作用范围 或有效范围)。 范围( )。表现为变量有的 即变量的作用范围(或有效范围)。表现为变量有的 可以在整个程序或其它程序中进行引用, 可以在整个程序或其它程序中进行引用,有的则只能在 局部范围内引用。 局部范围内引用。 按其作用域范围可分为两种: 局部变量和 按其作用域范围可分为两种:即局部变量和全局变量 变量的生存期 变量从被生成到被撤消的这段时间。 变量从被生成到被撤消的这段时间。实际上就是变量 占用内存的时间 时间。 占用内存的时间。 按其生存期可分为两种: 动态变量和 按其生存期可分为两种:即动态变量和静态变量
3、全局变量作用域和生存期0; float n = 定义 定义全局变量, 定义全局变量, 全局变量 void main ( ) 并赋初值 在函数外部作定义说明的变量,也称为外部变量 在函数外部作定义说明的变量,也称为外部变量 。它 不属于哪一个函数,而属于一个源程序文件。 不属于哪一个函数{ 而属于一个源程序文件。 , 局部变量 int s; 作用域 float t; 定义变量的位置开始到本源文件结束 及有extern 到本源文件结束, 局部 全 从定义变量的位置开始到本源文件结束,及有extern scanf ("%f", &n); 局 的其它源文件。 说明的其它源文件 s 说明的其它源文件。= sign ( ); //取符号 取符号 变量s、 变量 、 变 #include <stdio.h> t = sqr ( ); //取平方根 取平方根 t的作 量 的作 生存期 #include <math.h> 与程序相同。 printf ("s = %d t = %f ", s, t); 用域 n 与程序相同。即从程序开始执行到程序终止的这段时 int sign ( ); } 的 间内,全局变量都有效。 间内,全局变量都有效。
量a赋初始值,不能都对变量a赋初 赋初始值,不能都对变量a 始值或都不赋值,否则编译错! 始值或都不赋值,否则编译错!
全局变量定义 因为赋了初值) (因为赋了初值)
2.3.4 变量的存储类型
概述 变量是对存储空间的抽象(在代码中) 变量是对存储空间的抽象(在代码中) 变量的属性 数据类型:变量所持有的数据的性质(操作属性)。 ① 数据类型:变量所持有的数据的性质(操作属性)。 规定了它们的取值范围和可参与的运算 范围和可参与的 规定了它们的取值范围和可参与的运算 。 ② 存储类型: 规定了变量占用内存空间的方式,也称 存储类型: 规定了变量占用内存空间的方式, 为存储方式。 为存储方式。 存储器类型:寄存器、静态存储区、 存储器类型:寄存器、静态存储区、动态存储区 例如: 例如: auto---------自动型 //c1,动态存储 自动型 auto char c1, c2; c2为自动字符变量 为自动字符变量 register-----寄存器型 //i为寄存器型变量 寄存器型 为寄存器型变量 register i; static -------静态型 //a, b为静态整型变量 static int 静态型 a, b; 为静态整型变量 静态存储 extern-------外部型 //x, y为外部整型变量 外部型 extern int x, y; 为外部整型变量 变量定义的完整形式应为: 变量定义的完整形式应为:
说明 (5) 全局变量定义与全局变量的说明的区别 extern int a; void func1 ( ) { …… //引用变量 引用变量a 引用变量 } extern int a = 2; void func2 ( ) { …… //引用变量 引用变量a 引用变量 }
全局变量说明
谁是定义? 谁是定义? 谁是说明? 谁是说明? 注意: 注意:两者中有且只能有一个对变
说明 在复合语句中定义的变量也是局部变量, (4) 在复合语句中定义的变量也是局部变量,其作用域 只在复合语句范围内。 只在复合语句范围内。其生存期是从复合语句被执行的时刻 到复合语句执行完毕的时刻。 到复合语句执行完毕的时刻。 #include <stdio.h> main中的局部变量 void main ( ) { int a = 2, b = 4; 复合语句中的局部变量 { int k, b; k = a + 5; mian中 复合语句中 mian中 b = a * 5; 变量k 变量a 变量k、b 变量a、b printf ("k = %d\n", k); 的作用域 的作用域 printf ("b = %d\n", b); 输出k 输出k = 7 } printf ("b = %d\n", b); 输出b 输出b = 10 a = k + 2; 输出b 输出b = 4 错误! 错误! }
局部变量r 局部变量 的作用域
说明 (1) 应尽量少使用全局变量。 应尽量少使用全局变量。
全局变量在程序全部执行过程中始终占用存储单元 降低了函数的独立性、通用性、 降低了函数的独立性、通用性、可靠性及可移植性 降低程序清晰性, 降低程序清晰性,容易出错
(2) 若外部变量与局部变量同名,则外部变量被屏蔽。要 若外部变量与局部变量同名,则外部变量被屏蔽。 引用全局变量,则必须在变量名前家上两个冒号“::” 引用全局变量,则必须在变量名前家上两个冒号“::” 注意:局部变量与全局变量同名极易导致程序 注意: #include <stdio.h> 员犯逻辑错误。 int a 员犯逻辑错误。 = 10; //全局变量 全局变量 void main ( ) { int a = 100; //局部变量(与全局变量同名) 局部变量( 局部变量 与全局变量同名) printf ("local a = %d\n", a); printf ("global a = %d能在其生存期内被引用, 变量只能在其生存期内被引用,变量的作用域 直接影响变量的生存期。作用域和生存期是从空间 直接影响变量的生存期。 和时间的角度来体现变量的特性。 和时间的角度来体现变量的特性。
2、局部变量作用域和生存期 定义 在函数内作定义说明的变量,也称为内部变量 在函数内作定义说明的变量,也称为内部变量 。 作用域 仅限于函数内,离开函数后不可再引用。 仅限于函数内,离开函数后不可再引用。 int f1 生存期 int y ) ( int x, 局部变量 从函数被调用的时刻到函数返回调用处的时刻( 从函数被调用的时刻到函数返回调用处的时刻(静态 { 局部变量除外)。 局部变量除外)。 int z; 变量x 变量x、y、z z = x > y ? x : y; 的作用域 return (z); } void f2 ( ) { printf ("%d\n", z ); ("%d\ } 引用错误! 引用错误!
运行结果: 运行结果: local a = 100 global a = 10
说明 全局变量定义必须在所有的函数之外, (3) 全局变量定义必须在所有的函数之外,且只能定义 一次,并可赋初始值。全局变量定义的一般形式为: 一次,并可赋初始值。全局变量定义的一般形式为: [extern] 类型说明符 全局变量名 = 初始值 全局变量名1[ 初始值1], …… , 全局变量名n[ 初始值n]; 全局变量名 = 初始值 ; 可选 例: int a = 2, b = 4; char ch = 'Y'; void main ( ) { …… } char ch; void func ( ) { …… }
变量名1 变量名2 变量名n 存储类型说明符 数据类型说明符 变量名1,变量名2,…,变量名n;
1、自动变量(auto型变量) 自动变量(auto型变量) 型变量 定义格式 [auto] 数据类型说明符 变量名 ,变量名 ,…,变量名 ; 变量名1,变量名2, ,变量名n; 说明 存储类型说明符auto可以省略。 auto可以省略 存储类型说明符auto可以省略。 自动变量只能在函数内 复合语句中定义 函数内或 定义, 自动变量只能在函数内或复合语句中定义,它属于局 部变量。 部变量。
运行结果: 运行结果:
void fun1( ), fun2( ); 0,0 main ( ) 1,1 全局变量说明 { 3,3 extern int x, y; printf ("%d,%d\n", x, y); 说明后 x = 2;y = 2; 的作用域 fun1( ); fun2( ); } 全局变量说明 extern int x, y; void fun1( ) { x = 1;y = 1; printf ("%d,%d\n", x, y); 说明后 } 全局变量定义 的作用域 int x = 0, y = 0; void fun2( ) 未说明前 { x = 3; y = 3; 的作用域 printf ("%d,%d\n", x, y); }
定义全局变量ch 定义全局变量ch
extern int a = 2, b = 4;
错误! 错误! ch只能定义一次 ch只能定义一次
说明 (4) 对全局变量进行说明,可扩展全局变量的作用域。 对全局变量进行说明,可扩展全局变量的作用域。 全局变量说明的一般形式为: 全局变量说明的一般形式为: extern 类型说明符 全局变量名1, …,全局变量名n; 全局变量名1 全局变量名n 不能省 不可赋初值
//计算数 的平方根 计算数n的平方根 计算数 float sqr ( ) 错误! 错误! { if ( n > 0 ) return (sqrt(n)); else return (-1); } //取数 的符号 取数n的符号 取数 int sign ( ) { int r = 0; if (n > 0) r = 1; if (n < 0) r = -1; return ( r ); } 局部变量 作 用 域