C语言程序设计(第4章函数)2
4.2函数的作用域规则
“语言的作用域规则”是确定一部分代码是否“可见”或者是否可以访问另一部分代码和数据的一组规则。
C语言中的每个函数都是一个独立的代码块。函数的代码块隐藏在函数内部,不能被任何其他函数中的任何语句访问(调用它的语句除外)(例如,不能用go to语句跳转到另一个函数内部)。构成函数体的代码对程序的其他部分是隐藏的,它既不会影响程序的其他部分,也不会被程序的其他部分影响。换句话说,因为两个函数的作用域不同,所以一个函数中定义的代码数据不能与另一个函数中定义的代码和数据进行交互。
C语言中的所有函数都在同一个作用域级别。也就是说,不可能在一个函数内部定义另一个函数。
4.2.1局部变量
函数内定义的变量成为局部变量。在一些C语言教材中,局部变量被称为自动变量,这与使用可选关键字auto定义局部变量的做法是一致的。局部变量只能由定义它们的模块中的语句访问。换句话说,局部变量在它们自己的代码模块之外是不可知的。记住:模块以左花括号开始,以右花括号结束。
关于局部变量,最重要的一点要知道,局部变量只存在于已定义的当前执行代码块中,即局部变量在进入模块时生成,退出模块时消亡。
定义局部变量的最常见的代码块是函数。例如,考虑以下两个函数。
[例4-5]
func 1()
{
int x;/*可以定义为auto int x;*/
x = 10;
}
func 2()
{
int x;/*可以定义为auto int x;*/
x =-1999;
}
整数变量x定义了两次,一次在func1()中,一次在func2()中。func1()和func2()中的x互不相关。原因是每个x只在定义的块中被认为是局部变量。
该语言包含关键字auto,可用于定义局部变量。但是由于所有非全局变量的默认值都被假设为auto,所以很少使用auto,所以本书的所有例子中并没有找到这个关键字。
最常见的做法是在每个功能模块的开头定义所有必需的变量。这使得任何人都很容易阅读这个函数并知道所使用的变量。但是没有必要这样做,因为局部变量可以在任何模块中定义。要了解其工作原理,请查看以下函数。
【例4-6】
f()
{
int t;
scanf("%d ",& t);
if(t = = 1){
char s[80];/*此变量仅在此块中有效*/
printf(" enter name:");
获取;/*输入字符串*/
进程;/*函数调用*/
}
}
这里的局部变量S在i f块的入口处建立,在其出口处消亡。因此,s只在i f块中是已知的,而在其他地方是不可访问的,甚至在包含它的函数的其他部分也是如此。
在条件块中定义局部变量的主要优点是,仅在需要时才分配内存。这是因为只有当控制转移到定义局部变量的块时,局部变量才进入生存期。虽然这在大多数情况下不是很重要,但当代码用于特殊控制器(如识别数字安全码的车库门控制器)时就变得非常重要,因为此时随机存取存储器(R A M)极其短暂。
因为局部变量是随着它们所定义的模块的导入和导出而建立或释放的,所以在块工作完成后,它们所存储的信息将会丢失。请记住,这对于访问相关功能尤其重要。当一个函数被访问时,它的局部变量被建立,当函数返回时,局部变量被销毁。也就是说,局部变量的值不能在两次调用之间保持。
4.2.2全局变量
不同于局部变量。全局变量贯穿整个程序,可以被任何模块使用。它们在整个程序执行过程中保持有效。全局变量在所有函数之外定义,可以由函数内的任何表达式访问。正如您在下面的程序中看到的,在所有函数中,变量count是在函数main()之前定义的。其实在第一次使用之前可以放在任何地方,只要不在函数里。实践表明,定义全局
变量的位置在程序的顶部。
[例4-7]
int count;/*count是全局变量*/
main()
{
count = 100;
0条评论