逻辑运算

逻辑运算对逻辑操作数执行计算,并返回相同类型的结果。

优先级

符号

说明

示例

结合性

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 = 3y = 4z = 5;
bool expr1 = x == y && z > 0;  // false, x != y, z does not matter
bool expr2 = x != y && z > 0;  // true,  both conditions are complied with
bool expr3 = x == y || z > 0;  // true,  it is sufficient that z > 0
bool expr4 = !x;               // false, x must be 0 to get true
bool expr5 = x > 0 && y > 0 && z > 0// true, all 3 are complied with
bool expr6 = x < 0 || y > 0 && z > 0// true, y and z are sufficient
bool expr7 = x < 0 || y < 0 || z > 0// true, z is sufficient

在计算 expr6 的字符串中,编译器发出警告:“检查运算符优先级可能存在的错误;请使用圆括号阐明优先级”。

请勿将逻辑运算 && 和 || 与按位运算 & 和 | 混淆(后者在 下一节中介绍)。