虽然我知道局部变量和全局变量之间的区别,但我只是无法理解它是否重要,尤其是在谈论主函数中的局部变量时。 例如,除了我们不能在其他函数中使用第二种情况下的 testvar 之外,这里有什么区别?
第一种情况:
#include <stdio.h>
int testvar;
第二种情况:
#include <stdio.h>
int main(void){
int testvar;
}
编辑:我的意思是,如果我只要在 main 中使用一个变量,那么将其声明为全局是否有任何优势,或者在这种情况下根本没有什么不同?
软件工程的良好做法是将名称的范围限制在它们的使用位置。如果testvar
在main
之外声明,那么它对main
之外的代码是可见的。这会使其面临一些错误,其中某些其他代码在打算使用其他对象时使用testvar
(另一个具有不同名称但键入错误的对象或具有相同名称的对象,但需要它的不同实例)。此外,因为它是用int testvar;
而不是static int testvar;
声明的,所以它将与其他模块中名为testvar
的其他对象链接。这是一个严重的问题 — 碰巧某些例程的一个作者出于自己的目的使用诸如AmountOfMemory
之类的名称,而其他例程的另一个作者出于自己的目的使用相同的名称,并且两段代码单独工作,但是,当链接到同一个程序中时,它们会中断。因此,好的代码会避免全局变量。
如果在main
中声明testvar
,则不会发生这些错误。编写好程序的可能性增加。因此,如果在main
之外不需要testvar
(按名称),最好在main
内声明它。
还有一个寿命问题。与作用域(名称可见)类似,我们更喜欢限制生存期(当对象存在时)。对于在main
内部定义的对象,它的生存期实际上与在任何函数外部声明的对象相同——它将在程序执行期间存在。所以生命在这里不是一个大问题。但是,有一种情况是这样。在C
中,允许在函数内部调用main
。这很少使用。但是,如果使用它并且testvar
是在main
外部定义的,则只有一个实例,并且main
的所有执行都将共享它们。如果testvar
在main
内部定义,则每个main
的执行都将有自己的testvar
实例,与其他实例分开。
函数内部定义的对象与函数外部定义的对象之间的另一个区别是,默认情况下,C 会自动将函数外部定义的对象初始化为零。但是,这不会影响选择定义对象的位置,因为可以根据需要提供显式初始化。
"虽然我知道局部变量和全局变量之间的区别是什么,但我只是无法理解它是否重要">
对我来说,在学习C时,我觉得我并没有真正理解局部变量和全局变量之间的区别,直到我理解了为什么它很重要。
Eric Postpischil关于范围和寿命的回答说明了一切。 这不仅仅是使用变量的方式和位置的差异;这是关于由于这种访问而可能发生的情况的更广泛影响。
因此,不要考虑"如果我只要使用main()中的变量">;要考虑封装,模块化,接口和共享代码。 我甚至建议永远不要使用全局变量;任何时候你都想这样做,值得努力寻找另一种方式来完成你想做的事情。 你未来的自己会感谢你现在养成的扎实的编程习惯。
除了我们不能在其他函数中使用第二种情况下的 testvar 之外,这里有什么区别?
从C标准的角度来看,这实际上是主要区别(见后面的另一个区别)。如果在main
中定义变量,则它具有自动存储持续时间,并且只能使用其在main
中的变量名称进行访问。如果在main
外部定义变量,则它具有静态存储持续时间,并且可以从代码中的任何位置使用其变量名称进行访问。
一个区别是,具有静态存储持续时间的变量默认初始化,而具有自动存储持续时间的变量则未初始化。因此,在您的第一个示例中,testvar
将初始化为零,而在第二个示例中未初始化。