5.2 逻辑运算符
Java 提供了三个逻辑运算符(logical operator):&&、|| 和 !,分别表示与、或、非。这些运算符的结果与其在英语中的含义类似。
例如,如果 x 大于 0 且小于 10,那么 x > 0 && x < 10 的结果为 true;对于表达式 evenFlag || n \% 3 == 0,只要其中一个条件为 true,即如果 evenFlag 为 true 或数字 n 能被 3 整除,那么这个表达式的结果就为 true。最后,运算符 ! 对 boolean 表达式求反,因此,如果 evenFlag 不为 true,则 !evenFlag 为 true。
逻辑运算符仅在必要时才计算第二个表达式的值。例如,true || anything 的结果在任何情况下都为 true,因此 Java 无需计算表达式 anything 的值。同样,false && anything 的结果在任何情况下都为 false。在可能的情况下忽略第二个操作数被称为短路(short circuit)求值,可与电路类比。短路求值可节省时间,在 anything 的值需要很长时间才能计算出时尤其如此。如果 anything 可能出现问题的话,这还可以避免不必要的错误。
如果你曾必须对包含逻辑运算符的表达式求反,以后也很可能遇到这样的情况。在这种情况下,德 · 摩根定律(De Morgan's laws)可以提供帮助:
!(A && B)与!A || !B等价!(A || B)与!A && !B等价
上述列表表明,要对逻辑表达式求反,可分别对每一项求反,并使用相反的运算符。运算符 ! 的优先级比 && 和 || 高,因此不需要将 !A 和 !B 分别放在括号中。
德 · 摩根定律也适用于关系运算符。在这种情况下,对每一项求反意味着使用“相反”的运算符:
!(x < 5 && y == 3 )与x > =5 || y! = 3等价!(x >= 1 || y! = 7 )与x < 1 && y == 7等价
将这些示例大声地朗读出来可能会有所帮助。例如,“如果不希望 x 小于 5,且不希望 y 为 3,就意味着 x 必须大于或等于 5,且 y 不能为 3。”
