跳至内容

Other Operations

其他操作

索引([])

当访问数组的第 i 个元素时,表达式 value 表示具有序列号 i 的变量的值。

示例:

array[i] = 3; // Assign the value of 3 to i-th element of the array.

数组的索引只能是整数。允许四维及以下的数组。每个维度的索引从 0 到维度大小 - 1。特别地,对于由 50 个元素组成的一维数组,对第一个元素的引用将是数组 [0],对最后一个元素的引用将是数组 [49]。

当访问超出数组范围时,执行子系统将生成严重错误,程序将停止。

使用 x1, x2,…, xn 参数调用函数

每个参数可以表示常量、变量或相应类型的表达式。传递的参数用逗号分隔,并且必须位于括号内,开括号必须紧跟在被调用函数的名称之后。

表达式 value 是函数返回的值。如果返回值类型为 void,则此类函数调用不能放在赋值操作的右侧。请确保 x1,…, xn 这些表达式按此顺序精确执行。

示例:

int length=1000000;
   string a="a",b="b",c;
//---Other Operations
   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(array[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;

作用域解析操作(::)

mql4 程序中的每个函数都有自己执行的作用域。例如,Print() 系统函数在全局作用域中执行。Imported 函数在其对应的导入作用域中调用。的方法函数在相应类的作用域中。作用域解析操作的语法如下:

[Scope_name]::Function_name(parameters)

如果没有作用域名称,则明确使用全局作用域。如果没有作用域解析操作,则在该最近的作用域中查找函数。如果本地作用域中没有函数,则会在全局作用域中搜索。

作用域解析操作还用于定义函数-类成员。

type Class_name::Function_name(parameters_description)
   {
// function body
   }

在程序中从不同执行上下文使用同名函数可能会导致歧义。没有明确指定作用域的函数调用的优先级顺序如下:

  1. 类方法。如果类中没有指定名称的函数,则继续到下一层。
  2. MQL4 函数。如果语言中没有这样的函数,则继续到下一层。
  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());
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   CCheckContext2 test;
   test.Print();
  }
//+------------------------------------------------------------------+

获取数据类型大小或任何数据类型对象的大小的操作(sizeof)

使用 sizeof 操作可以定义与标识符或类型对应的内存大小。sizeof 操作的格式如下:

示例:

sizeof(expression)

任何包含在括号中的标识符或类型名称都可以作为表达式使用。注意,不能使用 void 类型名称,标识符不能属于位域,也不能是函数名称。

如果表达式是静态数组的名称(即第一个维度已指定),则结果是整个数组的大小(即元素数量与类型长度的乘积)。如果表达式是动态数组的名称(未指定第一个维度),则结果将是动态数组对象的大小。

当 sizeof 应用于结构或类类型的名称,或结构或类类型的标识符时,结果是结构或类的实际大小。

示例:

struct myStruct
     {
      char   h;
      int    b;
      double f;
     } str;
   Print("sizeof(str) = ",sizeof(str));
   Print("sizeof(myStruct) = ",sizeof(myStruct));

大小在编译阶段计算。

另请参阅

优先级规则

最后更新于