【时时三省】(C语言基础)局部变量和全局变量例题
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省
例题
有一个一维数组,内放10个学生成绩,写一个函数,当主函数调用此函数后,能求出平均分、最高分和最低分。解题思路:调用一个函数可以得到一个函数返回值,现在希望通过函数调用能得到。个结果。可以利用全局变量来达到此目的。
编写程序:
运行结果:
程序分析:
main函数在调用average函数时,把实参数组score的首元素地址和整数10传递给形参数组array和形参变量n ,函数average的值是return语句带回的aver的值(在主函数中赋给了变量ave)。这样,在main函数中就得到了平均分。而最高分和最低分是通过全局变量Max和Min获得的。由于Max和Min是全局变量,是公用的,各函数都可以直接引用它们,也可以向它们赋值。现在在average函数中,改变了它们的值,最后把最高分和最低分存放在Max和Min中。在主函数可以使用这两个变量的值。因此在main函数中输出的Max和Min就是希望得到的最高分和最低分。
但是,建议不在必要时不要使用全局变量,原因如下:
①全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元。
②它使函数的通用性降低了,因为如果在函数中引用了全局变量,那么执行情况会受到有关的外部变量的影响,如果将一个函数移到另一个文件中,还要考虑把有关的外部变量及其值一起移过去。但是若该外部变量与其他文件的变量同名时,就会出现问题。这就降低了程序的可靠性和通用性。在程序设计中,在划分模块时要求模块的“内聚性”强、与其他模块的“耦合性”弱。即模块的功能要单一(不要把许多互不相干的功能放到一个模块中),与其他模块的相互影响要尽量少,而用全局变量是不符合这个原则的。一般要求把C程序中的函数做成一个相对的封闭体,除了可以通过“实参一形参”的渠道与外界发生联系外,没有其他渠道。这样的程序移植性好,可读性强。
③使用全局变量过多,会降低程序的清晰性,人们往往难以清楚地判断出每个瞬时各个外部变量的值。由于在各个函数执行时都可能改变外部变量的值,程序容易出错。因此,要限制使用全局变量。
注意:如果在同一个源文件中,全局变量与局部变量同名,这时会出现什么情况呢?请考虑是按哪一种情况处理:
( 1 )出错;
( 2 )局部变量无效,全局变量有效:
( 3 )在局部变量的作用范围内,局部变量有效,全局变量被“屏蔽”,即它不起作用。请先分析下面的程序。
例题
若外部变量与局部变量同名,分析结果。
编写程序:
运行结果:
8
程序分析:
在此例中,故意重复使用a和b作变量名,请读者区别不同的a和b的含义及作用范围。程序第2行定义了全局变量a和b,并对其初始化。第3行是main函数,在main函数中(第6行)定义了一个局部变量a。局部变量a的作用范围为第6~8行。
在此范围内全局变量a被局部变量a屏蔽,相当于全局变量a在此范围内不存在(即它不起作用),而全局变量b在此范围内有效。因此第6行中max ( a,b )的实参a应是局部变量a,所以max ( a,b )相当于max ( 8,5 )。它的值为8。
第10行起定义max函数,形参a和b是局部变量。全局变量a和b在max函数范围内不起作用,所以函数max中的a和b不是全局变量a和b,而是形参a和b,它们的值是由实参传给形参的,即8和5。从运行结果看,max ( a,b )的返回值为8,而不是5。验证了以上的分析。