局部变量与全局变量的区别
局部变量和全局变量之间的关键区别
- 局部变量在函数内部声明,而全局变量在函数外部声明。
- 局部变量在函数开始执行时创建,并在函数终止时消失,而全局变量在执行开始时创建,并在程序结束时消失。
- 局部变量不提供数据共享,而全局变量提供数据共享。
- 局部变量存储在栈上,而全局变量存储在由编译器决定的固定位置。
- 局部变量需要参数传递,而全局变量则不需要
什么是变量?
变量是分配给程序可以操作的存储区域的名称。变量类型决定了变量内存的大小和布局。
它还决定了需要存储在该内存中的值的范围以及可以应用于该变量的操作的性质。
变量的作用域
变量的作用域就是变量的生命周期。它是变量适用的或存在的代码块。例如
function foo(){ var x; }
您在函数“foo”内部声明了一个变量“x”。该变量的作用域保留在该函数内部,不能在该函数外部使用。
在编程语言中,有三个地方可以声明变量
- 在函数或代码块内:局部变量
- 在所有函数之外:全局变量
- 在函数参数的定义中:形式参数
局部变量
局部变量被定义为在编程块或子例程内声明的一种变量。它只能在声明它的子例程或代码块内部使用。局部变量在函数块执行期间存在。之后,它将被自动销毁。
局部变量示例
public int add(){ int a =4; int b=5; return a+b; }
这里,“a”和“b”是局部变量
全局变量
程序中的全局变量是在子例程或函数外部定义的变量。它具有全局作用域,意味着它在其整个程序生命周期内都保留其值。因此,除非被遮蔽,否则程序中的任何函数都可以访问它。
示例
int a =4; int b=5; public int add(){ return a+b; }
这里,“a”和“b”是全局变量。
局部变量 vs 全局变量
以下是局部变量和全局变量之间的一些基本区别。
参数 | 局部 | Global |
---|---|---|
范围 | 在函数内部声明。 | 在函数外部声明。 |
值 | 如果未初始化,则存储垃圾值 | 如果未初始化,则默认存储零。 |
终身 | 它在函数开始执行时创建,并在函数终止时消失。 | 它在程序全局执行开始之前创建,并在程序终止时消失。 |
数据共享 | 由于只有当前函数可以访问局部变量的数据,因此无法实现数据共享。 | 可以实现数据共享,因为多个函数可以访问同一个全局变量。 |
参数 | 为了在其他函数中访问局部变量的值,需要进行参数传递 | 全局变量在整个程序中可见,因此不需要参数传递,因为它是可见的 |
修改变量值 | 当局部变量的值在一个函数中被修改时,另一个函数看不到这些更改。 | 当全局变量的值在一个函数中被修改时,更改在程序的其余部分中可见。 |
访问者 | 可以通过语句访问局部变量,在声明它们的函数内部。 | 您可以通过程序中的任何语句访问全局变量。 |
内存存储 | 除非另有指定,否则它存储在栈上。 | 它存储在由编译器决定的固定位置。 |
使用全局变量的优点
- 您可以从程序中的所有函数或模块访问全局变量
- 您只需要在模块外声明全局变量一次。
- 它最适合存储“常量”,因为它有助于保持一致性。
- 当多个函数访问相同数据时,全局变量很有用。
使用局部变量的优点
- 使用局部变量可以保证在任务运行时变量的值保持不变
- 如果多个任务同时更改同一个正在运行的变量,则结果可能不可预测。但将其声明为局部变量可以解决此问题,因为每个任务都会创建自己的局部变量实例。
- 您可以在不同的函数中使用相同的名称为局部变量命名,因为它们仅被声明它们的函数识别。
- 一旦函数结束,局部变量就会被删除,并释放它占用的内存空间。
使用全局变量的缺点
- 如果声明了过多的全局变量,它们将在程序执行完成之前一直保留在内存中。这可能导致内存不足问题。
- 数据可以被任何函数修改。程序中的任何语句都可以更改全局变量的值。这可能会在多任务环境中产生不可预测的结果。
- 如果由于代码重构而停用了全局变量,则需要更改所有调用它们的模块。
使用局部变量的缺点
- 局部变量的调试过程相当棘手。
- 由于模块之间无法共享数据,因此需要反复传递公共数据。
- 它们的作用域非常有限。
哪个更有用?
在任何语言中编写程序时,局部变量和全局变量同样重要。但是,大量的全局变量可能会占用大量内存。对全局变量的不期望的更改很难识别。因此,建议避免声明不需要的全局变量。