MQL5语言帮助文件人话版(二十五)第二章(四) 语句和表达式之运算优先规则

| 发表于 6 小时前 | 显示全部楼层 |复制链接
运算优先规则类似于小学数学里学的“结合律”,先乘除后加减,先小括号后大括号,当然编程中的运算符本来就多,优先规则也会稍微复杂点。

运算优先级决定了包含多个运算符的表达式中,各子表达式的执行先后顺序:优先级高的运算符先执行,优先级低的后执行;同一优先级的运算符,按照「结合性」决定执行方向(左结合:从左到右;右结合:从右到左)。

原手册中罗列了一个15行的运算符优先表,这15种运算符的优先级别依次降低,同级别运算符运算优先级别按照表格“执行顺序”一列中规定的由左到右或从右到左,也就是“结合性”。

优先级层级表(从高到低):

第 1 级(最高):后缀 / 访问类运算符

运算符:()(函数调用)、[](数组下标)、.(结构体 / 类成员访问)、::范围解析符

结合性:左结合,也就是先算左边的,后算右边的

说 明:优先级最高的一级,所有数据访问、函数调用都会最先执行。

举 例:

- `tickArray[0].ask`:先算`[0]`取出数组元素,再算`.`访问结构体成员

- `ENUM_ORDER_TYPE::ORDER_TYPE_BUY`:`::`优先级最高,先解析出枚举常量

- `iMA(_Symbol, PERIOD_H1, 20, 0, MODE_SMA, PRICE_CLOSE, 0)`:函数调用`()`优先执行

第 2 级:单目运算符

运算符:!(逻辑非)、~(按位取反)、+(正号)、-(负号)、++/--(前缀自增 / 自减)、(类型名)(强制类型转换)、sizeof

结合性:右结合,也就是先算右边的,后算左边的

说 明:只操作一个操作数的运算符,优先级高于二元算术运算。

示 例 :

- `!isUp && price > 1.0`:先算`!isUp`取反,再计算逻辑与

- `sizeof(arr) / sizeof(arr[0])`:先算出两个 sizeof 的结果,再做除法

- !!isTrue等价于!(!isTrue)

第 3 级:乘除模算术

运算符:`*`(乘)、`/`(除)、`%`(取模 / 求余)

结合性:左结合,也就是先算左边的,后算右边的

说 明:和数学规则一致,先乘除后加减。

示 例:`a + b * c`:先算`b*c`,再算加法

第 4 级:加减算术

运算符:`+`(加)、`-`(减)

结合性:左结合,也就是先算左边的,后算右边的

示 例:`Close[0] - Open[0] + High[0]`:从左到右依次计算

第 5 级:移位运算符

运算符:`<<`(左移)、`>>`(右移)

结合性:左结合,也就是先算左边的,后算右边的

说 明:位运算,EA 日常开发极少用到,了解即可。

第 6 级:大小关系比较

运算符:`<`、`<=`、`>`、`>=`

结合性:左结合,也就是先算左边的,后算右边的

说 明:比较大小的关系运算,优先级高于相等比较和逻辑运算。

举 例:`high_1 >= high_0 && low_1 <= low_0`:先算两边的`>=`和`<=`,再计算`&&`

第 7 级:相等关系比较

运算符:`==`(等于)、`!=`(不等于)

结合性:左结合,也就是先算左边的,后算右边的

示例:`result.retcode == TRADE_RETCODE_DONE`

第 8~10 级:按位运算

运算符:`&`(按位与)、`^`(按位异或)、`|`(按位或)

结合性:左结合,也就是先算左边的,后算右边的

说 明:位运算,EA 常规策略开发极少用到。

第 11 级:逻辑与

运算符:`&&`

结合性:左结合,也就是先算左边的,后算右边的

说 明:逻辑 “并且”,优先级显著高于逻辑或。

示 例:`isUp && volume > 0 && Close[0] > ma`:从左到右依次判断,一个为假就提前终止

第 12 级:逻辑或

运算符:`||`

结合性:左结合,也就是先算左边的,后算右边的

说 明:逻辑 “或者”,优先级低于逻辑与。

示 例:(high_1 >= high_0 && low_1 <= low_0) || (high_0 >= high_1 && low_0 <= low_1)

即使去掉括号,也会先算两边的`&&`,再算中间的`||`—— 因为`&&`优先级高于`||`。加括号只是为了可读性更好。

第 13 级:条件运算符(三目运算符)

运算符:`条件 ? 表达式1 : 表达式2`

结合性:右结合,也就是先算右边的,后算左边的

说 明:简化的 if-else,优先级低于逻辑运算,高于赋值。

示 例:`double direction = isUp ? 1 : -1;`

第 14 级:赋值运算符

运算符:`=`、`+=`、`-=`、`*=`、`/=`、`%=`等

结合性:右结合,也就是先算右边的,后算左边的

说 明:赋值操作优先级很低。右结合意味着`a = b = 5`等价于`a = (b = 5)`。

示 例:`sum += Close`

第 15 级(最低):逗号操作符

运算符:`,`

结合性:左结合,也就是先算左边的,后算右边的

说 明:所有运算符中优先级最低,严格从左到右执行,最终返回最右侧表达式的值。

示 例:

`for(int i=0, j=99; ...)`:初始化部分的逗号是逗号操作符,因为优先级最低,两个赋值表达式先各自执行,再作为整体

`int a = (1, 2, 3);`:必须加括号,否则逗号优先级比`=`还低,会被编译器当成变量定义的分隔符。

特殊说明:

(1)记住这个核心顺序就能覆盖 99% 的开发场景:

函数 / 数组 / 成员访问 > 单目运算 > 乘除模 > 加减 > 大小比较 > 逻辑与 > 逻辑或 > 赋值 > 逗号

(2)逻辑与一定比逻辑或优先级高:不要默认它们同级,`a || b && c` 等价于 `a || (b && c)`,不是`(a || b) && c`。

(3)比较运算优先级高于逻辑运算:price > 1.0 && volume > 0 不用额外加括号,先比较再逻辑运算是默认规则。

(4)逗号优先级最低:只要想把逗号表达式作为整体赋值、传参,必须加括号,否则会出现语法或逻辑错误。

(5)不确定就加括号:括号不会影响性能,还能提升可读性,是最稳妥的做法。
最近访问 头像模式
举报

评论 使用道具

发新帖
EA交易
您需要登录后才可以评论 登录 | 立即注册

麻爪

麻爪 D

如果你想让一个人下地狱,介绍他做交易。
如果你想让一个人在地狱里永不超生,介绍他做EA交易。

Fast跟单EA