Visibility Scope and Lifetime of Variables
变量的可见范围与生命周期
在所有函数外部声明的变量属于全局作用域。可以在程序的任何地方访问这些变量。这些变量位于全局内存池中,因此它们的生命周期与程序的生命周期相同。
在代码块内部声明的变量属于局部作用域。这样的变量在声明它的代码块之外是不可见的(因此不可用)。最常见的局部声明情况是在函数内部声明的变量。局部声明的变量位于栈上,其生命周期等于函数的生命周期。
由于局部变量的作用域是它声明的代码块,因此可以与其他代码块中声明的变量或更高层次(直到全局级别)声明的变量具有相同名称的变量。
示例:
void CalculateLWMA(int rates_total,int prev_calculated,int begin,const double &price[])
{
int i,limit;
static int weightsum=0;
double sum=0;
//---
if(prev_calculated==0)
{
limit=MA_Period+begin;
//--- set empty value for first limit bars
for(i=0; i<limit; i++) LineBuffer[i]=0.0;
//--- calculate first visible value
double firstValue=0;
for(int i=begin; i<limit; i++)
{
int k=i-begin+1;
weightsum+=k;
firstValue+=k*price[i];
}
firstValue/=(double)weightsum;
LineBuffer[limit-1]=firstValue;
}
else
{
limit=prev_calculated-1;
}
for(i=limit;i<rates_total;i++)
{
sum=0;
for(int j=0; j<MA_Period; j++) sum+=(MA_Period-j)*price[i-j];
LineBuffer[i]=sum/weightsum;
}
//---
}注意在行```mql4 for(int i=begin; i<limit; i++) { int k=i-begin+1; weightsum+=k; firstValue+=k*price[i]; }
可以使用访问说明符[static](../static-variables/)来声明局部变量。在这种情况下,编译器将变量放在全局内存池中。因此,静态变量的生命周期等于程序的生命周期。这种情况下,该变量的作用域仅限于它声明的代码块。
## 另请参阅
[数据类型](../../data-types/)、[类型的封装和扩展性](../../object-oriented-programming/encapsulation-and-extensibility-of-types/)、[变量的初始化](../initialization-of-variables/)、[对象的创建和删除](../creating-and-deleting-objects/)。最后更新于