MQL4入门教学:运算符与表达式详解

表达式

算术运算符

赋值运算符

关系运算符

布尔运算符

位运算符

其他运算符

优先级规则

某些数字和字符的组合在编程中具有特殊意义,它们被称为运算符,例如:

算术运算符:+ – * / %

逻辑运算符:&& ||

赋值运算符:= += *=

运算符通常用于表达式中,只有与操作数结合时才具有实际意义。

需要特别注意标点符号的使用,如圆括号、方括号、逗号、冒号和分号。

运算符、标点符号和空格用于划分语句的不同组成部分。

表达式

表达式由一个或多个操作数和运算符组合而成,可以分行书写。

示例:

a++; b = 10;x = (y * z) / (w + 2) + 127;表达式的结尾必须使用分号(;)进行标记。

算术运算符

算术运算符包括加、减、乘、除等基本运算:

求和 i = j + 2;求差 i = j - 3;改变符号 x = - x;求积 z = 3 * x;求商 i = j / 5;求模 minutes = time % 60;自增 i++;自减 k--;自增和自减运算符不能出现在表达式中。

示例:

int a=3;a++; // 合法的表达式int b=(a++)*3; // 不合法的表达式赋值运算符

表达式的计算结果会赋给左侧的变量。

y = x; //将变量 x 的值赋值给变量 y以下赋值运算符可以将算术运算或位运算与赋值操作结合:

y += x; //在 y 的当前值上加上 x y -= x; //从 y 的当前值中减去 x y *= x; //将 y 的当前值乘以 x y /= x; //将 y 的当前值除以 x y %= x; //计算 y 除以 x 的余数 y = x; //将 y 的值右移 x 位(逻辑移位) y <<= x; //将 y 的值左移 x 位(逻辑移位) y &= x; //对 y 和 x 执行按位与运算 y |= x; //对 y 和 x 执行按位或运算 y ^= x; //对 y 和 x 执行按位异或运算表达式中只能包含一个赋值运算符。位运算符仅适用于整型数据。在逻辑移位运算符中,x 的值必须是小于 5 位的二进制数,超出范围的数值将被拒绝,因此移动位数限制在 0 到 31 之间。使用 %= 运算符时,会计算 y 除以 x 的余数,并将结果赋给 y。

关系运算符

在编程中,整数 0 代表逻辑假值 FALSE,任何非零值代表逻辑真值 TRUE。

由关系运算符或逻辑运算符组成的表达式,其计算结果为 0(假)或 1(真)。

a = b; //a 等于 b a != b; //a 不等于 b a< b; //a 小于 b a b; //a 大于 b a <=b; //a 小于等于 b a = b; //a 大于等于 b对于浮点型数据,不能直接使用 = 或 != 运算符进行比较,但可以通过计算两者之差并将结果与 null 比较来实现。

布尔运算符

逻辑非运算符(!)的操作数必须是算术类型。如果操作数为 FALSE(0),则非运算结果为 TRUE(1);如果操作数不为 FALSE(0),则结果为 FALSE(0)。

if(!a) Print("不是 'a'");逻辑或运算符(||)用于表示两个条件中只要有一个成立即可。如果 x 和 y 中至少有一个为真,则表达式结果为 TRUE(1);否则为 FALSE(0)。

if(x<0 || x=max_bars) Print("超出范围");逻辑与运算符(&&)要求两个条件同时为真时,表达式结果为 TRUE(1);否则为 FALSE(0)。

if(p!=x && py) Print("TRUE");位运算符

取反运算符(~)会对变量的二进制位进行按位取反,即所有 1 变为 0,所有 0 变为 1。

b = ~n;右移运算符(>>)会将二进制表示的 X 向右移动 Y 位,左侧空出的位置用零填充,属于逻辑移位。

x = x y;左移运算符(<<)会将二进制表示的 X 向左移动 Y 位,右侧空出的位置用零填充。

x = x << y;按位与运算符(&)会比较两个操作数对应的二进制位,如果两者都为 1,则该位结果为 1,否则为 0。

b = ((x & y) != 0);按位或运算符(|)会比较两个操作数对应的二进制位,如果两者都为 0,则该位结果为 0,否则为 1。

b = x | y;按位异或运算符(^)会比较两个操作数对应的二进制位,如果相异,则该位结果为 1,否则为 0。

b = x ^ y;位运算符仅适用于整型数据类型。

其他运算符

下标

数组第 i 个元素的索引,i 可以是整数或整型表达式。

示例:

array[i] = 3; //将 3 赋值给数组的第 i 个元素。只有整数才能作为数组的下标。数组最多支持四维,每维索引从 0 开始,到(数组长度-1)结束。例如,一个由 50 个元素组成的一维数组,第一个元素是 array[0],最后一个元素是 array[49]。

如果访问数组时超出下标范围,系统会报错 ERR_ARRAY_INDEX_OUT_OF_RANGE(下标越界),可以通过调用 GetLastError() 函数获取错误详情。

调用具有 x1, x2, …, xn 形式参数的函数

每个形参可以是常量、变量或相应类型的表达式。参数之间用逗号分隔,并放在圆括号内,函数名置于圆括号前。

函数调用会返回表达式的值。如果函数返回类型为 void,则不能将此调用放在赋值号的右侧。需要确保形参 x1, x2, …, xn 按顺序执行。

示例:

double SL=Bid-25*Point;int ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,SL,Ask+25*Point,"My comment",123,0,Red);逗号运算符

逗号分隔的表达式按照从左到右的顺序执行。所有表达式会先计算左边的值,再计算右边的值,最终结果的类型和值由最右边的表达式决定。函数的参数表也可以看作是逗号运算符的一个应用实例(参见上文)。

示例:

for(i=0,j=99; i<100; i++,LMAX外汇平台j--) Print(数组[i][j]);优先级规则

下表中同组的运算符具有相同的优先级。排在上面的运算符优先级更高,排在下面的优先级更低。运算符按优先级从高到低排列如下:

() 函数调用 从左到右[] 引用数组元素! 真假运算符 从右到左- 改变符号++ 自增-- 自减~ "按位取反"运算符& "按位与"位运算符 从左到右| "按位或"位运算符^ "按位异或"位运算符<< 逻辑左移 逻辑右移* 乘法 从左到右/ 除法% 求模+ 加法 从左到右- 减法< 小于 从左到右<= 小于等于 大于= 大于等于== 等于!= 不等于|| 逻辑 或 从左到右&& 逻辑 与 从左到右= 赋值 从右到左+= 加法复合赋值运算符-= 减法复合赋值运算符*= 乘法复合赋值运算符/= 除法复合赋值运算符 %= 求模复合赋值运算符 = 右移复合赋值运算符<<= 左移复合赋值运算符&= 按位与复合赋值运算符|= 按位或复合赋值运算符^= 按位异或复合赋值运算符, 逗号 从左到右高优先级的圆括号可以改变运算符的执行顺序。

注意:在 MQL4 程序中,运算符的优先级与 C 语言有所不同。