其他运算
其他运算
指数 ( [] )
在数组第一元素的位置,表达式值为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)
{
// 函数主体
}在一个程序使用不同执行上下文的几个同名函数可能会引起歧义。无明确范围规范的函数调用的优先顺序如下:
- 类方法。如果在类中设置了无指定名称的函数,那么移到下一级别。
- MQL5 函数。如果语言没有这种函数,那么移到下一级别。
- 用户定义全局函数。如果没有找到有指定名称的函数,那么移到下一级别。
- 导入函数。如果没有发现有指定名称的函数,那么编译器返回一个错误。
- 若要避免函数调用歧义,就要使用范围解析操作,始终明确指定函数范围。 示例:
#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));在编辑步骤计算大小。