局部变量和全局变量
局部变量
定义变量可能有3种情况:
- 在函数的开头定义
- 在函数内的复合语句内定义
- 在函数的外部定义
在一个函数内部定义的变量只在本函数范围内有效,也就是说只有在本函数内才能引用它们,在此函数以外是不能使用这些变量的
在复合语句内定义的变量只在本复合语句范围内有效,只有在本复合语句内才能引用它们,在该复合语句以外是不能使用这些变量的
以上称为“局部变量”
主函数中定义的变量也只在主函数中有效,并不因为在主函数中定义而在整个文件中或程序中有效。主函数也不能使用其他函数中定义的变量
不同函数中可以使用同名的变量,它们代表不同的对象,互不干扰
形参也是局部变量
在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效,这种复合语句也称为“分程序”或“程序块”
全局变量
程序的编译单位是源程序文件,一个源文件可以包含一个或若干个函数,在函数内定义的变量是局部变量,而在函数外定义的变量称为外部变量,外部变量是全局变量(也称全程变量)
全局变量可以为本文件中其他函数所共用。它的有效范围为从定义变量的开始到本源文件结束
在一个函数中既可以使用本函数中的局部变量,也可以使用有效的全局变量
设置全局变量的作用是增加了函数间数据联系的渠道,由于同一文件中的所有函数都能引用全局变量的值,因此如果在一个函数中改变了全局变量的值,就能影响到其他函数中全局变量的值,相当于各个函数间有直接的传递通道,由于函数的调用只能带回一个函数返回值,因此有时可以利用全局变量来对增加函数间的联系渠道,通过函数调用能得到一个以上的值
建议不在必要时不要使用全局变量,原因如下:
- 全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟
- 它使函数的通用性降低了,因为如果在函数中引用了全局变量,那么执行情况会受到有关的外部变量的影响,如果将一个函数移到另一个文件中,还要考虑把有关的外部变量及其值一起移过去。但是若该外部变量与其他文件的变量同名时,就会出现问题。这就降低了程序的可靠性和通用性。在程序设计中,在划分模块时要求模块的“内聚性”强、与其他模块的“耦合性”弱。即模块的功能要单一(不要把许多互不相干的功能放到一个模块中)与其他模块的相互影响要尽量少,而用全局变量是不符合这个原则的。一般要求C程序中的函数做成一个相对的封闭体,除了可以通过“实参---形参”的渠道与外界发生联系外,没有其他渠道。这样的程序移植性好,可读性强
- 使用全局变量过多,会降低程序的清晰性,人们往往难以清楚的判断出每个瞬时各个外部变量的值。由于在各个函数执行时都可能改变外部变量的值,程序容易出错。因此,要限制使用全局变量
如果在同一个源文件中,全局变量和局部变量同名时,在局部变量的作用范围内,局部变量有效,全局变量被“屏蔽”,即全局变量不起作用