MQL5语言帮助文件人话版(二十五)第二章(四) 语句和表达式之运算优先规则
运算优先规则类似于小学数学里学的“结合律”,先乘除后加减,先小括号后大括号,当然编程中的运算符本来就多,优先规则也会稍微复杂点。运算优先级决定了包含多个运算符的表达式中,各子表达式的执行先后顺序:优先级高的运算符先执行,优先级低的后执行;同一优先级的运算符,按照「结合性」决定执行方向(左结合:从左到右;右结合:从右到左)。
原手册中罗列了一个15行的运算符优先表,这15种运算符的优先级别依次降低,同级别运算符运算优先级别按照表格“执行顺序”一列中规定的由左到右或从右到左,也就是“结合性”。
优先级层级表(从高到低):
第 1 级(最高):后缀 / 访问类运算符
运算符:()(函数调用)、[](数组下标)、.(结构体 / 类成员访问)、::范围解析符
结合性:左结合,也就是先算左边的,后算右边的
说 明:优先级最高的一级,所有数据访问、函数调用都会最先执行。
举 例:
- `tickArray.ask`:先算``取出数组元素,再算`.`访问结构体成员
- `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)`:先算出两个 sizeof 的结果,再做除法
- !!isTrue等价于!(!isTrue)
第 3 级:乘除模算术
运算符:`*`(乘)、`/`(除)、`%`(取模 / 求余)
结合性:左结合,也就是先算左边的,后算右边的
说 明:和数学规则一致,先乘除后加减。
示 例:`a + b * c`:先算`b*c`,再算加法
第 4 级:加减算术
运算符:`+`(加)、`-`(减)
结合性:左结合,也就是先算左边的,后算右边的
示 例:`Close - Open + High`:从左到右依次计算
第 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 > 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)不确定就加括号:括号不会影响性能,还能提升可读性,是最稳妥的做法。
页:
[1]