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
}在程序中从不同执行上下文使用同名函数可能会导致歧义。没有明确指定作用域的函数调用的优先级顺序如下:
- 类方法。如果类中没有指定名称的函数,则继续到下一层。
- MQL4 函数。如果语言中没有这样的函数,则继续到下一层。
- 用户定义的全局函数。如果没有找到指定名称的函数,则继续到下一层。
- 导入函数。如果没有找到指定名称的函数,编译器将返回错误。
- 为了避免函数调用的歧义,始终使用作用域解析操作明确指定函数作用域。 示例:
#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));大小在编译阶段计算。