其他运算

指数 ( [] )

在数组第一元素的位置,表达式值为i的系列数变量值。

示例:

array[i] = 3; // 数组的3的计算值到第i个元素。

只有整数能够成为数组指数。四维以下的数组是禁止的。每组的检测是从0到测量大小-1。 特定情况下,对于维数组由50 个元素组成,参照的第一个数组将为[0],这样最后一个数组将是[49]。

访问超出数组,正在执行的子系统生成危险错误,程序停止。

调用x1, x2 ,..., xn自变数函数

每一个自变数可以显示一个常数,一个变量和相应类型表达式。自变数的通过必须根据通道命令。

用此函数返回表达式值。如果返回的表达式值为空,一些函数不能进行中转。注意表达式按照这个顺序执行expressions x1,..., xn 。

示例:

   int length=1000000;

   string a="a",b="b",c;

//---

   int start=GetTickCount(),stop;

   long i;

   for(i=0;i<length;i++)

     {

      c=a+b;

     }

   stop=GetTickCount();

   Print("time for 'c = a + b' = ",(stop-start)," milliseconds, i = ",i);

逗号操作符 ( , )

从左到右的表达式用逗号分开。所有表达式的计算是从左至右的。结果类型和值相互吻合,说明表达式是正确的。参量列表可以作为范例被通过(参阅上文)。

示例:

for(i=0,j=99; i<100; i++,j--) Print(数组[i][j]);

点操作符 ( . )

对于直接访问结构和类的公共成员 时,使用点操作符。语法:

Variable_name_of_structure_type.Member_name

示例:

   struct SessionTime

     {

      string sessionName;

      int    startHour;

      int    startMinutes;

      int    endHour;

      int    endMinutes;

     } st;

   st.sessionName="Asian";

   st.startHour=0;

   st.startMinutes=0;

   st.endHour=9;

   st.endMinutes=0;

范围解析操作符 ( :: )

mql5中每个函数都有其执行范围。例如,Print()系统函数可以在全局范围使用。Imported函数导入时使用。classes函数用在类的范围。范围解析操作语法如下:

[Scope_name]::Function_name(parameters)

如果没有范围名,就属于全局范围函数。如果没有范围解析操作,可以在最近范围内找到函数。如果本地范围没有函数n,需要全局搜寻函数。

范围解析操作也用在 确定函数-类成员。

type Class_name::Function_name(parameters_description)

   {

// 函数主体

   }

在一个程序使用不同执行上下文的几个同名函数可能会引起歧义。无明确范围规范的函数调用的优先顺序如下:

  1. 类方法。如果在类中设置了无指定名称的函数,那么移到下一级别。
  2. MQL5 函数。如果语言没有这种函数,那么移到下一级别。
  3. 用户定义全局函数。如果没有找到有指定名称的函数,那么移到下一级别。
  4. 导入函数。如果没有发现有指定名称的函数,那么编译器返回一个错误。

若要避免函数调用歧义,就要使用范围解析操作,始终明确指定函数范围。

示例:

#property script_show_inputs

#import "kernel32.dll"

   int GetLastError(void);

#import



class CCheckContext

  {

   int         m_id;

public:

               CCheckContext() { m_id=1234; }

protected:

   int         GetLastError() { return(m_id); }

  };

class CCheckContext2 : public CCheckContext

  {

   int         m_id2;

public:

               CCheckContext2() { m_id2=5678; }

   void        Print();

protected:

   int         GetLastError() { return(m_id2); }

  };

void CCheckContext2::Print()

  {

   ::Print("Terminal GetLastError",::GetLastError());

   ::Print("kernel32 GetLastError",kernel32::GetLastError());

   ::Print("parent GetLastError",CCheckContext::GetLastError());

   ::Print("our GetLastError",GetLastError());

  }

//+------------------------------------------------------------------+

//| 脚本程序启动函数                                                   |

//+------------------------------------------------------------------+

void OnStart()

  {

//---

   CCheckContext2 test;

   test.Print();

  }

//+------------------------------------------------------------------+

获得数据类型大小或者任何类型数据对象大小的运算 ( sizeof )

使用sizeof运算,标识符或者类型大小可以确定。 sizeof 运算有以下格式:

示例:

sizeof(expression)

任何标识符,或者类型名都在括号中,可用作表达式。注意空类型名不可以使用,标识符不属于二进制,也不是函数名。

如果表达式为静态数组名(例如给出第一尺寸),那么结果就是整个数组大小(例如类型长度产品)。如果表达式是动态数组名(没有确定第一尺寸),结果就是动态数组对象大小。

当sizeof用在结构或者类型名时,或者结构或者类型标识符时,结果就是结构或者类的真实大小。

示例:

   struct myStruct

     {

      char   h;

      int    b;

      double f;

     } str;

   Print("sizeof(str) = ",sizeof(str));

   Print("sizeof(myStruct) = ",sizeof(myStruct));   

在编辑步骤计算大小。

另见

优先规则