跳至内容
Visibility Scope and Lifetime of Variables

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/)。
最后更新于