第19讲 全局变量及其作用域和生存期 函数的存储分类
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例:在同文件中扩展全局变量的作用域
main( )
{void gx(),gy();
extern int x,y;
…… gx(); gy();
……
扩展后 新增的 作用域
}
void gx( ) {……}
书印错!
int x,y;
void gy( ) { ……
x,y的原 作用域
}
extern int x,y;
第19讲
全局变量及其作用域和生存期 函数的存储分类
8.3 全局变量及其作用域和生存期
全局变量只有静态一种类别,放在静态存储区。
1. 全局变量的作用域和生存期 全局变量是可以在函数外部任意位置上定义的变量,它的 作用域是从定义点到整个源文件结束。
说明: (1)全局变量为函数之间的数据传递提供了一条通道。由于同
i+=m+1; m=i+a+b;
return(m);
}
A) 8,17
B) 8,16
C) 8,20
D) 8,8
8.10 以下程序的输出结果是
。
#include<stdio.h>
main()
{ int a[]={ 1,2,3,4 },i;
int x=0;
for(i=0; i<4; i++)
{
x=sub(a);
void fun( int s[])
{ static int j=0;
do
s[j]+=s[j+1];
while(++j<2);
}
main()
{ int k, a[10]={1,2,3,4,5};
for(k=1; k<3; k++) fun(a);
for(k=0; k<5; k++) printf("%d", a[k]);
max=a[0];
average=f(x);
min=a[0];
printf("max=%d,min=%d,average=
for(i=1;i<10;i++) %f\n",max,min,average);
{sum=sum+a[i]; }
if(a[i]>max) max=a[i];
if(a[i]<min) min=a[i]);
用
{ x=111;
域
……
}
/*file2.c*/ extern int x; f2( ) {
printf(“%d\n”,x); /*111*/ …… } f3( ) { x++; printf(“%d\n”,x); /*112*/
…… }
3.不允许扩展其作用域的全局变量(静态全局变量)
当定义全局变量时,若加上static,则称为静态全局变量, 其作用域仅限于本编译单位(本文件)。
}
A) 3
B) 4
C) 6
D) 9
8.13 以下程序的输出的结果是
。
int x=3;
main()
{ int i;
for (i=1;i<x;i++) incre();
}
incre()
{ static int x=1;
x*=x+1;
printf(" %d",x);
}
A) 3 3
B) 2 2 C) 2 6 D) 2 5
/*file1.c*/ static int n; void f(); main() { …… f(); }
n的作 用域被 限定死
/*file2.c*/ extern int n; void f() {
…… }
注意:static对局部变量和全局变量的作用效果不同。对局 部变量:作用域没变,存储类改为静态;对全局变量:存储 类没变,作用域仅限于本文件(小全局)。
例8.4 编一函数求出10个整数的最大值、最小值和平均值。
main()
int max,min;
{int x[10],j;
float f(int a[10])
float average;
{ int i,sum=a[0];
for(j=0;j<10;j++)
float aver;
scanf("%d",&x[j]);
main()
{
……
}
void gx() { …… }
扩展后 x,y的 作用域
int x,y;
void gy() { ……
x,y的 作用域
}
例:在不同文件中扩展全局变量的作用域
/*file1.c*/
int x,y;
main( )
{
……
扩
f1();
展
f2();
后
f3();
x,y的
x
Hale Waihona Puke Baidu
……
作用域
的
}
作
f1( )
8.14 下列程序执行后输出的结果是
#include <stdio.h>
f(int a)
{ int b=0;
static c=3;
a=c++,b++;
return (a);
}
main( )
{
int a=2,i,k;
for(i=0;i<2;i++) k=f(a++);
printf("%d\n",k);
习题分析
8.9 以下程序的输出结果是
。
#include <stdio.h>
main()
{ int k=4,m=1,p;
p=func(k,m); printf("%d,",p);
p=func(k,m); printf("%d\n",p);
}
func(int a,int b)
{
static int m=0,i=2;
一文件的所有函数都能引用全局变量的值,如果在一个函 数中改变了某全局变量的值,就能影响使用该全局变量的 其它函数,相当于各个函数间有了直接传递的通道。 (2)全局变量的生存期是整个程序的运行期间,即“长期”。 (3)若全局变量与某一函数中的局部变量同名,则在该函数中, 全局变量被屏蔽,使用局部变量。
}
aver=sum/10.0;
return aver;
}
例8.5 全局变量与局部变量同名问题。
int sum;
运行结果为:
void fun(void);
**main(1)**:10
main()
** fun **:20
{
**main(2)**:10
sum=10;
printf("**main(1)**:%d\n",sum); 虽然全局变量的作用域大,
8.4 函数的存储分类
1 外部函数 当定义一个函数时,若在函数返回值的类型前加上extern(或
缺省)时,称此函数为“外部”函数。它可以被同一个程序的其 它文件中的函数调用。
当函数调用语句与被调函数不在同一编译单位(源文件),且函 数的返回值为非整型时,应该在调用语句所在函数的说明部分用 extern对所调用的函数进行说明。
}
A) 3
B) 0
C) 5
。 D) 4
下面程序的输出结果是 。 #include <stdio.h> #define MAX_COUNT 4 void fun(); main() { int count; for (count=1; count<=MAX_COUNT; count++) fun(); } void fun()
{ static int i; i+=2; printf("%d",i);
}
以下程序的输出结果是 。 main() {
int a=3,b=2,c=1; c-=++b;
b*=a+c; {
int b=5,c=12; c/=b*2; a-=c; printf(“%d,%d,%d,”,a,b,c); a+=--c; } printf(“%d,%d,%d\n”,a,b,c); }
2 内部函数 当定义一个函数时,若在函数返回值的类型前加上static时,
称此函数为“静态”函数(或“内部”函数)。它只能被本 编译单位中的其它函数所调用。
使用静态函数,可避免不同的编译单位因为函 数同名而引起的混乱。
例:外部函数
/* file1.c */ main() {extern float f(float a,float b);
(2) 当一个程序由多个文件组成时,每个文件都是一个独立 的编译单位。如果多个文件中都需要用同一个全局变量,这时 若在每个文件中都定义一个同名的全局变量,则单独编译各个 文件时不会产生错误,编译程序将按定义分别为它们分配存储 空间;但当连接时,将产生同一变量的重复定义的错误。
解决办法是:在其中一个文件中定义的全局变量,在其它 文件中用extern进行说明,说明这些全局变量已在某一编译单 位中定义过,通知编译程序不必再为它们开辟存储单元,只是 将作用域进一步扩展到本编译单位中。
printf("%d",x);
}
printf("\n");
}
sub(int s[])
{ static int t=3;
int y;
y=s[t];
t--;
return y;
}
A) 1 2 3 4
B) 4 3 2 1
C) 0 0 0 0
D) 4 4 4 4
8.11 下面程序的输出结果是
。
#include <stdio.h>
fun();
生存期长,用起来似乎方便
printf("**main(2)**:%d\n",sum); 灵活,但除十分必要外,一
}
般不提倡使用全局变量。主
void fun(void)
要有以下原因:
{
全局变量sum在fun
int sum; 函数中不起作用。
sum=20;
1.长期占用存储空间。 2.影响了函数的独立性, 不便于移植。
/* 说明f是其它文件(编译单位)已经定义的外部函数 */
float x,y,z; …… z=f(x,y); …… }
/* file2.c */ extern float f(float a,float b) { …… }
static float f(float a,float b)
第八章 作业
教材P128 习题八 第一大题:1、2、3、5、7、8小题; 第二大题:1、2、3、4小题;
}
A) 34756
B) 23445
C) 35745
D) 12345
8.12 下面程序的输出结果是 。
fun3(int x)
{
static int a=3;
a+=x;
return(a);
}
main()
{
int k=2, m=1, n;
n=fun3(k);
n=fun3(m);
printf("%d\n",n);
printf("** fun **:%d\n",sum);
3.人在读程序时,难以确
}
定某一时刻的当前值。
2. 全局变量作用域的扩展
(1) 当全局变量定义在后,引用它的函数在前时,应该在引 用它的函数中用extern对此全局变量进行说明,使其作用域从 extern说明处起,延伸到该函数末尾。也可将extern写在函数 之外,使其作用域延伸至文件末尾。