c语言程序设计(周经亚)第7章 利用函数实现模块化程序设计-
c语言第7章 模块化程序设计
青岛大学软件技术学院
7.2.2 递归调用
1.定义 嵌套调用还有一种特殊的格式,就是一个函数直接或者间接的调 用自己,称为递归调用。如图所示:
函数
调用
调用
函数A
函数B
青岛大学软件技术学院
2.【案例7.2]有5各人坐在一起,求第五个人的岁数?他比第四个人大3岁。 第四个人比第三个人大3岁,第三个人比第二个人大3岁,第二个人比第 一个人大3岁。第一个人是10岁。(用递归编程)
青岛大学软件技术当执行语句tranValue(a,b)调用函数时,为形参x,y分配内存空间,并将实参 a,b的值赋给x,y。形参和实参拥有不同的存储空间。 2)执行tranValue函数体内部的语句时,形参的值会发生变化,但是不影响实 参的值。 3)tranValue函数执行完毕,形参的内存空间释放,实参的值不变。
7.2.3 指针变量做形参
1.定义
在函数调用时,将实参的地址传递给形参,实参和形 参共用同一个存储单元,当形参的值发生变化时,实 参的值也发生变化。
青岛大学软件技术学院
2.[案例7.3]值传递和传递地址的比较
/*使用传递地址和传递值的方式,改变两个变量的值*/ #include <stdio.h> Void tranAddress(int *p1, int *p2) /*形参是两个指针变量*/ {*p1+=10; *p2-=5; } Void tranValue(int x, int y) /*形参时两个整型变量*/ { x+=10; y-=5; } Int main() {int a=3,b=5; printf(“调用函数前a=%d,b=%d\n”,a,b); tranValue(a,b); printf(“使用值传递方式调用函数后,a=%d,b=%d\n”,a,b); tranAddress(&a,&b); printf(“使用地址传递方式调用函数后,a=%d,b=%d\n”,a,b); }
第7章_用函数实现模块化程序设计_[谭浩强_C程序设计_(第四版)]
例7.3将例7.2稍作改动,将在max函数中定 义的变量z改为float型。函数返回值的类型 与指定的函数类型不同,分析其处理方法。 解题思路:如果函数返回值的类型与指定 的函数类型不同,按照赋值规则处理。
#include <stdio.h> int main() { int max(float x,float y); float a,b; int c; scanf("%f,%f,",&a,&b); c=max(a,b); 变为2 printf("max is %d\n",c); return 0; 1.5 2.6 } int max(float x,float y) { float z; z=x>y?x:y; return( z ) ; } 2 2.6
C语言要求,在程序中用到的所有函数, 必须“先声明,再定义,后使用”
7.2 怎样定义函数
函数名字、函数返回值类型、函数实现 的功能以及参数的个数与类型 函数名字——以便以后按名调用
函数类型——函数返回值的类型
函数参数的名字和类型——以便在调用 函数时向它们传递数据 函数的功能——函数的具体实现
实参和形参间的数据传递
在调用有参函数时,主调函数和被调用函 数之间有数据传递关系 定义函数时函数名后面的变量名称为“形 式参数”(简称“形参”) 主调函数中调用一个函数时,函数名后面 参数称为“实际参数”(简称“实参”)
在调用函数过程中,系统会把实参的值传 递给被调用函数的形参 或者说,形参从实参得到一个值,该值在 函数调用期间有效
主函数 #include <stdio.h> int main() { int max4(int a,int b,int c,int d); int a,b,c,d,max; 输入4个整数 printf(“4 interger numbers:"); scanf("%d%d%d%d",&a,&b,&c,&d); max=max4(a,b,c,d); printf("max=%d \n",max); return 0; }
【最新】用函数实现模块化程序设计
2021/2/2
43
实参、形参都是float型
float average(float array[10])
{ int i;
与score共占同一存储单元
float aver,sum=array[0];
for(i=1;i<10;i++)
相当于score[0]
sum=sum+array[i];
aver=sum/10; return(aver);
如例7.1中的“print_star();”
2021/2/2
31
调用函数的方式:
➢按函数在程序中出现的位置来分,可以有 以下3种函数调用方式 2. 函数表达式 ➢函数出现在一个表达式中,这种表达式称 为函数表达式
如例7.2中的“c=max(a,b);”
2021/2/2
32
调用函数的方式:
➢按函数在程序中出现的位置来分,可以有 以下3种函数调用方式 3. 函数参数 ➢函数调用作为一个函数的实参
2021/2/2
12
➢说明:
(4) 所有函数都是平行的,即在定义函数时是 分别进行的,是互相独立的。一个函数并不从 属于另一个函数,即函数不能嵌套定义。函数 间可以互相调用,但不能调用main函数。 main函数是由系统调用的。
2021/2/2
13
➢说明:
(5) 从用户使用的角度看,函数有两种。 库函数,它是由系统提供的,用户不必自己定
{ int z;
定义函数内
if (x>y) z=x; 使用的变量
else z=y;
return(z);
}
2021/2/2
26
c=max(a,b); (main函数)
07_01_C语言程序设计_第七章 用函数实现模块化程序设计_周常欣
小节
本节主要介绍了函数的定义方法、函数 的调用,函数调用时的数据传递、函数的 返回值以及简单的函数的应用举例。
在科学中,新事物只伴随困难出现!
C
程 序 设 计 |
第 七 章
本节课堂习题
1、对C语言函数体的描述,下面正确的是(
A.可以定义和调用其它函数 B.可以调用但不能定义其他函数 C.不可调用但可以定义其它函数 D.不可调用及定义其它函数
(3)实参和形参在数量上,类型上,顺序上应严格一 致,否则会发生类型不匹配”的错误。
(4)通过return语句将函数值带回到主调函数。应当 注意返回值的类型要与函数类型一致。 (5)调用结束,形参单元被释放。
C
程 序 设 计 |
第 七 章
第七章 用函数实现模块化程序设计
7.3.4 函数的返回值
如果需要从被调用函数带回一个函数值(供主调函 数使用),被调用函数中必须包含return语句。 如果不需要从被调用函数带回返回值,可不用 return语句。 return语句后面的括号可以不加。 return z;与return(z);等价。 return后面还可以是一个表达式: int max(int x, int y) { return (x>y?x:y); }
int max(int x,int y) //定义有参函数 { int z; //声明部分 z=x>y?x:y; //执行部分 return(z); //指定函数返回值 }
自定义函数max
max(a,b);
调用max函数的语句
C
程 序 设 计 |
第 七 章
第七章 用函数实现模块化程序设计
函数调用的三种形式
int max(int x,in ty) //定义有参函数 { int z; //声明部分 z=x>y?x:y; //执行部分 return(z); //指定函数返回值 }
C语言 第7章 用函数实现模块化程序设计
第7章用函数实现模块化程序设计为什么要用函数怎样定义函数为什么要定义函数⏹C语言要求,在程序中用到的所有函数,必须“先定义,后使用”⏹指定函数名字、函数返回值类型、函数实现的功能以及参数的个数与类型,将这些信息通知编译系统。
定义函数的方法1.定义无参函数类型名函数名(){函数体}2.定义有参函数定义有参函数的一般形式为:类型名函数名(形式参数表列){函数体}3. 定义空函数定义空函数的一般形式为:类型名函数名(){}调用函数函数调用的形式⏹函数调用的一般形式为:函数名(实参表列)函数调用的形式⏹按函数调用在程序中出现的形式和位置来分,可以有以下3种函数调用方式:1. 函数调用语句⏹把函数调用单独作为一个语句如printf_star();⏹这时不要求函数带回值,只要求函数完成一定的操作2. 函数表达式⏹函数调用出现在另一个表达式中如c=max(a,b);⏹这时要求函数带回一个确定的值以参加表达式的运算3. 函数参数⏹函数调用作为另一函数调用时的实参如m=max(a,max(b,c));⏹其中max(b,c)是一次函数调用,它的值作为max另一次调用的实参函数调用时的数据传递1.形式参数和实际参数❑在调用有参函数时,主调函数和被调用函数之间有数据传递关系❑定义函数时函数名后面的变量名称为“形式参数”(简称“形参”)❑主调函数中调用一个函数时,函数名后面参数称为“实际参数”(简称“实参”)❑实际参数可以是常量、变量或表达式2. 实参和形参间的数据传递❑在调用函数过程中,系统会把实参的值传递给被调用函数的形参❑或者说,形参从实参得到一个值❑该值在函数调用期间有效,可以参加被调函数中的运算对被调用函数的声明和函数原型⏹在一个函数中调用另一个函数需要具备如下条件:(1) 被调用函数必须是已经定义的函数(是库函数或用户自己定义的函数)(2) 如果使用库函数,应该在本文件开头加相应的#include 指令(3) 如果使用自己定义的函数,而该函数的位置在调用它的函数之前,可以不声明函数的嵌套调用函数的递归调用⏹在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。
c语言程序设计第7章 用函数实现模块化程序设计
函数体为空
函数体
➢先用空函数占一个位置,以后逐步扩充 ➢好处:程序结构清楚,可读性好,以后
扩充新功能方便,对程序结构影响不大
7.3 调用函数
7.3.1函数调用的形式 7.3.2函数调用时的数据传递 7.3.3函数调用的过程 7.3.4函数的返回值
7.3.1函数调用的形式
➢函数调用的一般形式为: 函数名(实参表列)
➢指定函数名字、函数返回值类型、函数 实现的功能以及参数的个数与类型,将 这些信息通知编译系统。
7.2.1 为什么要定义函数
➢指定函数的名字,以便以后按名调用 ➢指定函数类型,即函数返回值的类型 ➢指定函数参数的名字和类型,以便在调
用函数时向它们传递数据 ➢指定函数的功能。这是最重要的,这是
在函数体中解决的
(5) 从用户使用的角度看,函数有两种。
库函数,它是由系统提供的,用户不必自己定义 而直接使用它们。应该说明,不同的C语言编译 系统提供的库函数的数量和功能会有一些不同, 当然许多基本的函数是共同的。
用户自己定义的函数。它是用以解决用户专门需 要的函数。
(6) 从函数的形式看,函数分两类。
① 无参函数。无参函数一般用来执行指定的一 组操作。无参函数可以带回或不带回函数值, 但一般以不带回函数值的居多。
➢问题:
如果程序的功能比较多,规模比较大,把所有代 码都写在main函数中,就会使主函数变得庞杂、 头绪不清,阅读和维护变得困难
有时程序中要多次实现某一功能,就需要多次重 复编写实现此功能的程序代码,这使程序冗长, 不精炼
7.1为什么要用函数
➢ 解决的方法:用模块化程序设计的思路
采用“组装”的办法简化程序设计的过程 事先编好一批实现各种不同功能的函数 把它们保存在函数库中,需要时直接用 函数就是功能 每一个函数用来实现一个特定的功能 函数的名字应反映其代表的功能
C语言第07章 用函数实现模块化程序设计
7.4 函数的声明和函数原型
在一个函数中调用另一个函数需要具备如下条 件:
(1) 被调用函数必须是已经定义的函数(是库函数或用 户自己定义的函数),如果使用库函数,应该在本文 件开头加相应的#include指令 (2) 如果使用自己定义的函数,而该函数的位置在调 用它的函数后面,则应在该函数的调用位置前对其 进行声明
定义函数
int prime(int n) { int i, isPrime=1; for (i=2;i<=sqrt(n);i++) if(n%i==0) { isPrime=0; break; } return isPrime; } 函数功能:判断一个 数n是否为素数
main( )
printf( )
在设计一个较大的程序时,往往把程序分为若 干个程序模块,每一个模块包括一个或多个函 数,每个函数实现一个特定的功能
函数概述
C程序可由一个主函数(main)和若干个其他函数 构成(其中a,b,c,d,e,f,g,h,i均为函数,箭头表示调 用) main
a
b
c
d
e
f
g
h
i
e
函数使用实例
例7.1 求100-200之间的素数,用函数调用实现 思路:
函数体没有任何内容
先用空函数占一个位置,通常是模块设计过程中 作为预留模块,以后逐步补充 好处:增强程序可读性,以后扩充新功能方便, 对程序结构影响不大
函数的定义实例
编写一个函数求两个数 的最大公约数。 分析: 需要带入两个整数,需要 返回一个值,类型也是整 数。
int gcd(int a, int b) { int r; r=a%b; // 求a除b的余数 while (r!=0) // 迭代,直到r为0 { a=b; b=r; r=a%b; } return b; // 函数返回值 }
c语言程序设计第07章用函数实现模块化程序设计
例7.2:(题同例7.1) void main( ) {int max(int x,int y); /*函数原型*/ int a,b,c; scanf(“%d%d”,&a,&b); c=max(a,b); /*调用函数max*/ printf(“max is %d\n”,c); } int max(int x,int y) {int z; z=(x>y)?x:y; return(z); /*可简化为return z; */ }
4 函数的定义及调用
函数的定义是分别进行的,是相互独立。一个函数并不 从属于另一个函数,即函数的定义是平行的,不能嵌 套。 一般函数只有被调用才能执行,函数间可以相互调用,
但不能调用main函数,main函数是系统调用的。函
数调用可以嵌套,还可以直接递归或间接递归。
7.2 函数的定义和调用
7.2.1 为什么要定义函数
2 函数调用过程
(1) 实参与形参必须一一对应(个数、类型、意义) (2) 执行函数调用时,首先按照定义的类型给形参分配存储单 元,并将实参的值传递给相应的形参,即“单向传值”。 然后执行函数体。 (3) 在执行函数体中的语句时,只有形参参加各种操作即使形 参的值发生改变,也不影响实参的值,即“单向传值” (4) 通过return语句将函数值带回到主调函数,亦称返回值。 函数体中可以出现多个return语句,但只能执行其中一个 当无返回值(无return语句)时,函数定义为void类型。 (5) 函数调用结束,形参单元被释放(值就不存在了),而实参 单元仍保留并维持原值,即“单向传值”。
编程序:
#include <stdio.h> int fac(int n) { int x; if (n==0) x=1; else x=n*fac(n-1); /*直接递归调用函数fac*/ return x; } void main( ) { int n,x; scanf(“%d”,&n); x=fac(n); /*调用函数fac*/ printf(“%d!= %d\n”,n,x); }
C语言程序设计 用函数实现模块化程序设计
7.3 函数参数和函数的值
二、函数的返回值
例7例8- 2 1.返回函数值的方法 #include <stdio.h> (1)函数的返回值也就是函数的 int max(int x,int y) y) int max(int x,int 值,如果一个函数有返回值, { int z; { if(x>y) return y; ; z = x > y ? x :>(x) ? x : y ); 就必须用return语句; return(x y return return((zz); ); } (2)一个函数中可以有多个 } void main() return语句,无论执行到哪 void main() { int a,b,c ; 个return语句,都将结束函 { int a,b,c ; scanf(“%d,%d”,&a,&b); 数调用,返回主调函数。 scanf(“%d,%d”,&a,&b); c=max(a,b); c=max(a,b); (3) return语句中的括号可以 printf(“The max is %d”, c); printf(“The max is %d”, c); } 省略,return后面可以是一 } 个表达式,返回的是表达式 的值。
13/73
7.3 函数参数和函数的值
一、形式参数和实际参数
说明: 1.定义函数时,必须说明形参类 型,形参只能是变量和数组; 2.函数被调用前,形参不占内存 ,函数调用结束后,内存也被释 放; 3.实参可以是常量、变量和表达 式; 4.实参和形参的类型必须一致, 字符型和整型可以相互匹配; 5.C语言中实参对形参的数据传 递是“值传递”,即单向传递 ,仅由参数的对应位置决定,与 名字无关。 例7例8- 2 #include <stdio.h> int max(int x,int y) b,int a) { int z; c; c x b a b: y; z = x > y ? x : a; return( z ); c x } void main() { int a,b,c ; scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“The max is %d”, c); } 23,56 The max is 56
高中信息技术选修《C语言程序设计:用函数实现模块化程序设计》PPT课件
这些数据在程序结束后由系统释放。
2019/2/6
25
栈区和堆区
栈区(stack)
由编译器自动分配释放 ,存放函数的参数值,局 部变量的值等。 由程序员分配释放 。 malloc、free
堆区(heap)
}
p、q的有效范围
c1、c2的有效范围
#include <stdio.h> int numCalls = 0; void foo()
{
++numCalls; } int main() { foo(); foo(); foo(); printf("%d\n", numCalls); 输出:3
}
10
例7.14 有一个一维数组,内放10个学生成绩,写一 个函数,当主函数调用此函数后,能求出平均分、 最高分和最低分。
全局变量(外部变量)
局部变量
静态存储方式 动态存储方式
从变量值存在的时间(即生存期),变量分为
如果一个变量值在某一时刻是存在的,则认为这一 时刻属于该变量的生存期
2019/2/6 21
操作 系统 内核
函数
用 户 区
22
2019/2/6
23
2019/2/6
24
全局数据区
全局数据区划分为三个区域。
2019/2/6
6
全局变量(Global Variable)
在所有函数之外定义的变量是全局变量,在定义它的 位置以后都有效
全局变量自动初始化为0 全局变量使函数之间的数据交换更容易,效率也高 一些 但是不推荐使用,甚至禁止使用
C语言程序设计第7章利用函数实现模块化程序设计-
说明:
参数——函数的输入信息;
返回值——函数的输出信息。
C语言程序设计——函数
@Soochow University,the School of Computer Science & Technology
8
函数的概述
# include <stdio.h> float fact(int n); void main() { int k, m, n; scanf float fk, fm, fn; scanf("%d%d%d", &m, &n, &k); 库函数 fm = fact(m); 调用 fn = fact(n); fk = fact(k); printf("%f\n", fm/(fn+fk)); } 定义 float fact(int n) { int i; float f=1; for(i=1; i<=n; i++) f=f*i; return f; }
C语言程序设计——函数 @Soochow University,the School of Computer Science & Technology
f=1; for(i=1; i<=n; i++) f=f*i;
4
函数的概述
# include <stdio.h> void main() { int k, m, n; float fk, fm, fn;
Chap7-1 用函数实现模块化 程序设计
(函数部分)
主要内容
函数概述 函数的声明 函数的定义与返回值 函数的参数 函数的调用 函数的递归调用
C语言程序设计——函数
第7章-C语言用函数实现模块化程序设计
什么样的程序片段适合写成独立的函数?
5
# include <stdio.h> 高职学院 {
计算机专业 void main() 程序设计基础》 《程序设计基础》
void printstar(); printstar(); print_message(); printstar(); }
运行情况如下: 运行情况如下: * * * * * * * * * * * * * * * * How do you do! * * * * * * * * * * * * * * * *
18
高职学院 计算机专业 程序Байду номын сангаас计基础》 《程序设计基础》
函数的调用2-2
函数调用时需要注意形参和实参之间的对应关系 数量相等:通常形参数量和实参数量要相等, 不要遗漏。 顺序相同:函数调用时实际参数列表的顺序, 要和函数定义时实参的顺序相同,这里的顺序 主要指变量代表的含义要一一对应。 类型匹配:即实际参数的类型要和形式参数的 类型一一对应且匹配。
16
高职学院 计算机专业 程序设计基础》 《程序设计基础》
函数的定义 -返回值为空函数
定义返回值为空函数的一般形式为: 定义返回值为空函数的一般形式为 返回值为空函数的一般形式为
void 函数名(形式参数表列) 函数名( 数表列)
{ 声明部分 语句部分 } 说明:类型返回值固定为void void, 说明:类型返回值固定为void,函数体内无需使用 return语句 主调函数中直接使用函数语句调用, 语句, return语句,主调函数中直接使用函数语句调用, 无需捕获函数执行情况, 无需捕获函数执行情况,通常这样的函数都是实 现一定的输出功能或者函数处理后受影响是主调 函数中变量的值。 函数中变量的值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
x=6 y=9 …… ….. x=6 y=9 堆 g_maxV …….. g_minV ……..
正文段 code
|-----------| | | |-----------| |栈 | |-----------| || | | /|\ | || | | | |-----------| |堆| |-----------| | 未初始化 | |-----------| | 初始化 | |-----------| | 正文段 | | | |-----------|
建议:在程序中尽量限制使用全局变量!!!
C语言程序设计
@Soochow University
C语言程序设计
5
变量的存储类别
从变量的作用域(即从空间)角度来分,可 以分为全局变量和局部变量。
从变量值存在的时间(即生存期)角度来分, 可以分为静态存储方式和动态存储方式。
静态存储方式是指在程序运行期间分配固定的存 储空间的方式。 动态存储方式则是在程序运行期间根据需要进行 动态的分配存储空间的方式。
|-----------| || |-----------| |栈| |-----------| ||| | /|\ | ||| |-----------| |堆| |-----------| | 未初始化 | |-----------| | 初始化 | |-----------| | 正文段 | |-----------|
C语言程序设计
C语言程序设计
@Soochow University
6
C程序的内存布局
C程序一直由下列部分组成:
1)正文段——CPU执行的机器指令部分;一个程序只有一个副 本;只读,防止程序由于意外事故而修改自身指令; 2)初始化数据段(数据段)——在程序中所有赋了初值的全 局变量,存放在这里。 3)非初始化数据段(bss段)——在程序中没有初始化的全局 变量;内核将此段初始化为0。 4)栈——增长方向:自顶向下增长;自动变量以及每次函数 调用时所需要保存的信息(返回地址;环境信息)。 5)堆——动态存储分配。 |-----------|(后面会讲到的指针 类型,它分配的内存空间就是在堆上)
C语言程序设计
周经亚 jy_zhou@
计算机科学与技术学院 C语言程序设计
第7章 用函数实现模块化程序设计-II
作用域含义:
变量作用域是指该变量可以被访问的代码段范围
根据作用域划分变量:
1、局部变量: 在某个函数内部(包括main)定义,隶属于该函数; 作用范围为定义点到所属函数结束; 2、全局变量: 在函数(包括main)外部定义,不属于任何函数; 作用范围为定义点到本源文件的结束,为本文件中其他函 数所共用;
将控制权转交被调用函数
被调用函数按照程序员预先编好的指令(代码)开始执行
C语言程序设计
@Soochow University
C语言程序设计
9
动态存储方式与静态存储方式
存储类别
数据在内存中存储的方法
两大类:
静态存储类和动态存储类。 具体包含四种:自动的(auto),静态的 (static),寄存器的(register),外部的 (extern) 根据变量的存储类别,可以知道变量的作用域 和生存期。
C语言程序设计
@Soochow University
C语言程序设计
2
全局/局部变量的注意点
1)函数的形参是局部变量; 2)复合语句中可定义变量; 例如:if (a>b) { int temp; temp=a; a=b; b=temp;} 3 )不同函数中可以使用同名的局部变量,不同代码段中 使用的同名变量的含义不同; 4 )全局变量与局部变量同名时,局部变量优先级高于全 局变量;例如: C语言程序设计
C语言程序设计
@Soochow University
3
例如:int p=1,q=5;
float f1(int a) { int b,c; …… } char c1; char f2(int x,int y) { int b,j; …… } main( ) { int p,c1; …… }
main()里看到的是局部变量p
C语言程序设计
@Soochow University
C语言程序设计
7
C程序的内存布局
实参Байду номын сангаас
//file.c main() int g_minV=0; //全局变量 int max(int x, int y) { max() g_minV = x<y?x:y; 形参 return (x>y?x:y); 形参 } int g_maxV; //全局变量 void main() { 实参 int x=6,y=9; 未初始化 maxV = max(x,y); printf("The max value: %d", g_maxV); 初始化 printf("The min value: %d", g_minV); } 程序段
动 态 存 储 区
静态存 储区 程序区
C语言程序设计
@Soochow University
C语言程序设计
8
函数调用机制
函数调用过程
建立被调函数的栈空间 保护调用函数的运行状态和返回地址
目的是保护好现场环境,以便函数调用完成后,能够返回到调用 函数前程序运行的正确状态
传递参数
传递的参数是放在栈空间中的,当函数调用完成,栈空间就会释 放掉,所以默认情况下,传递的参数是按值传递的(也就是形参 对实参进行值拷贝,形参和实参在内存中其实是两个完全不同的 地址空间,只是二者的数值相同)
C语言程序设计
@Soochow University
C语言程序设计
4
全局变量的说明
全局变量的优点:
全局变量的作用是增加了函数间数据联系的渠道 命名惯例:例如:int g_num;
全局变量的缺点:
全局变量在程序的全部执行过程中都占用存储单元,而不是 仅在需要时才开辟单元 它使函数的通用性降低了,因为函数在执行时要依赖于其所 在的外部变量。不符合:在程序设计中,在划分模块时要求 模块的“内聚性”强、与其他模块的“耦合性”弱的原则 使用全局变量过多,会降低程序的清晰性,人们往往难以清 楚地判断出每个瞬时各个外部变量的值