保持敬畏之心
交易是一场持久战

​MQL4(7):什么是变量作用域

变量的作用域通俗点讲,就是这个变量在哪些地方可以使用、在哪些地方是看不见的且不可以使用。你可以把它理解为变量的“活动范围”或“有效区域”,假设你有一个对讲机(变量),你把它放在了厨房(一个函数内部):在厨房里你能用它,但你去了客厅(另一个函数),你就听不到也用不了它。这就是变量只在它“出生的地方”能用,出了那个范围就无效了。

在 MQL4 里,常见的变量作用域有三种:

局部变量
  • 只在函数内部创建和使用

  • 函数结束就“消失”

void MyFunction()
{
int a = 5;  //  a 只能在这个函数里用
Print(a);
}

在函数外面你再写 Print(a) 就会报错,提示 a 未定义。

全局变量
  • 在程序最上面定义

  • 可以在所有函数中使用(整个 .mq4 文件都能用)

int a = 10;  //全局变量 
void OnStart() 
{
 Print(a); //可以访问 
} 
void MyFunc() 
{
 a = a + 1; //也能修改 
}
静态变量
  • 定义在函数内部,但不会随着函数结束而被销毁

  • 常用于保存“历史状态”

void OnTick()
{
static int count = 0;
count++;
Print("调用次数:", count);
}

这个函数每次调用 count 会累加,但变量不会重新变成 0,因为它是 static 静态变量

局部变量与全局变量简单对比
变量类型 定义位置 有效范围(作用域) 生命周期
局部变量 函数内部 当前函数内部 函数执行期间
全局变量 所有函数外部 整个脚本(所有函数都能访问) EA运行期间
静态变量 函数内部加 static 当前函数内部 全局有效但仅在本函数中使用

初学者重点记住:在函数 {} 里定义的变量,出了这个大括号就没了;想要所有函数都能用,就写在函数外面;想让变量记住历史记录,用 static

变量的作用域决定了该变量可以在程序的哪些部分被访问(可见性),以及它的生命周期(在内存中存在的时间)。

局部变量是在函数内部声明的变量,它的作用域仅限于声明它的函数体内部,即只有在该函数内部才能引用该变量。默认情况下,每次函数被调用执行时,其内部的局部变量都会被重新创建和初始化。当函数执行结束返回时,该局部变量就会被销毁,其占用的内存也会被释放。

静态局部变量是局部变量的一种特殊情况。通过在局部变量声明前添加 static 关键字来定义。与普通局部变量不同,静态局部变量在函数首次执行到其声明时被初始化,并且在函数执行结束后不会被销毁,其值会一直保留在内存中直到整个程序(如 EA 或脚本)结束运行。当该函数再次被调用时,静态局部变量将不会被重新初始化,而是会保持上一次调用结束时的值。

声明静态局部变量的语法如下:

// 在函数内部声明一个静态整型变量
static int MyStaticVar;

需要强调的是,即使是静态局部变量,其作用域(可见性)仍然仅限于声明它的那个函数内部。如果希望一个变量能够被程序中的多个不同函数所访问和共享,那么应该使用全局变量,而非静态局部变量。声明全局变量时,不需要也不应使用 static 关键字。

全局变量是在所有函数外部声明的变量,通常习惯放在源代码文件的最上方。全局变量的作用域是全局的,意味着它们对于程序中的所有函数都是可见和可访问的。只要程序在运行,全局变量就一直存在于内存中,其值可以在不同的函数调用之间传递和保持。

初始化全局变量的语法与初始化局部变量完全相同,没有特殊的声明或初始化方式。

// 在所有函数外部声明并初始化一个全局变量
int GlobalCounter = 0;

本篇文章仅简单的讲解下变量作用域,后面会分别详细介绍局部变量、全局变量的使用场景以及应用技巧。

赞(0)
未经允许不得转载:图道交易 » ​MQL4(7):什么是变量作用域