其他运算

指数 ( [] )

在数组第一元素的位置,表达式值为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));   

在编辑步骤计算大小。

另见

优先规则