逻辑运算
逻辑运算对逻辑操作数执行计算,并返回相同类型的结果。
优先级 |
符号 |
说明 |
示例 |
结合性 |
---|---|---|---|---|
2 |
! |
逻辑“非” |
!e1 |
右 |
11 |
&& |
逻辑“与” |
e1 && e2 |
左 |
12 |
|| |
逻辑“或” |
e1 || e2 |
左 |
逻辑“非”将 true 转换为 false 并将 false 转换为 true。
如果两个操作数都为 true,则逻辑“与”运算结果为 true。
如果至少有一个操作数为 true,则逻辑“或”运算结果为 true。
“与”和“或”运算符总是从左到右计算操作数,在可能的情况下,会采用短路求值机制。如果左操作数为 false,那么“与”运算符会跳过第二个操作数,因为结果已经为false,此时“与”运算符对结果没有有任何影响。如果左操作数为 true,那么出于同样的原因,“或”运算符跳过第二个操作数,因为在任何情况下,结果都为 true。
这通常在程序用于避免第二个(及后续)操作数引发的错误。例如,我们可以通过以下表达式来避免发生“访问不存在的数组元素”错误:
index < ArraySize(array) && array[index] != 0 |
这里我们使用 ArraySize 内置函数,该函数可返回数组长度。仅当 index 小于该长度时,才读取具有该索引的元素并与零进行比较。
对照检查时,也会使用 ||,例如:
ArraySize(array) == 0 || array[0] == 0 |
如果数组为空,则条件立即为真。并且只有在有元素的情况下,才会继续对内容进行其他检查。
如果表达式包含通过逻辑“或”组合而成的多个操作数,则当第一个操作数为 true(如有)时,将立即得到最终结果为 true。但是,如果操作数是通过逻辑“与”组合而成,则当第一个操作数为 false 时,将立即得到最终结果为 false。
当然您可以在一个表达式中组合不同的操作,但需要注意其优先级的不同:取反优先执行,然后是逻辑“与”相关的条件,最后是逻辑“或”相关的条件。如果需要另一个序列,必须使用圆括号明确指定。
例如,以下不带圆括号的表达式 A && B || C && D 实际上等同于:(A && B) || (C && D)。若要让逻辑“或”优先执行,需用圆括号括起来:A && (B || C) && D。有关使用圆括号的更多详细信息,参见 用圆括号分组一节。
ExprLogical.mq5 脚本中给出了几个简单例子,让你通过实践来检查逻辑运算。
int x = 3, y = 4, z = 5;
|
在计算 expr6 的字符串中,编译器发出警告:“检查运算符优先级可能存在的错误;请使用圆括号阐明优先级”。
请勿将逻辑运算 && 和 || 与按位运算 & 和 | 混淆(后者在 下一节中介绍)。