Java核心技术速学版(第3版)
上QQ阅读APP看书,第一时间看更新

1.4.5 关系运算符和逻辑运算符

== 和 != 运算符的功能是测试相等性。例如,当n不为0时,表达式n != 0的值为true。此外,<(小于)、>(大于)、<=(小于或等于)和 >=(大于或等于)运算符都是常用的运算符。

你也可以将boolean类型的表达式与 &&(与)、||(或)和 !(非)运算符组合。例如:

0 <= n && n < length

当n介于0(包含0)和length(不包含length)之间时,表达式为真。

以上表达式中,如果第一个条件为false,则第二个条件不会被计算。如果第二个条件可能会产生错误,那么这种“短路”测试的方式非常有用。考虑以下条件:

n != 0 && s + (100 - s) / n < 50

如果n为0,那么第二个条件,即其中包含除n运算的条件永远不会被求值,因此也不会出现除数为0的计算错误。

短路测试也可以用于“或”运算,只要一个操作数为true时,其余的求值就会停止,即不计算第二个条件。例如:

n == 0 || s + (100 - s) / n >= 50

如果n为0,则以上表达式将得到true,并且第二个条件不会被计算。

最后,条件(conditional)运算符接受3个操作数:一个条件和两个值。如果条件为true,整个表达式的结果是第一个值,否则是第二个值。例如:

time < 12 ? "am" : "pm" 

表示如果time < 12 为真,则得到字符串"am",否则得到字符串"pm"。

注意:Java还有位运算符 & (位与)、|(位或) 、^(位异或)。它们是针对整数,按照位模式进行运算的。例如,由于0xF的二进制数字是0...01111,因此n & 0xF就会得到n的二进制数字中的最低4位; n = n | 0xF 将会将n的二进制值的最低4位设置为1; n = n ^ 0xF则将翻转n的最低4位。与 ! 运算符类似的位运算符是 ~ ,它的功能是翻转操作数的所有位,即~0xF的结果是1...10000。

此外,还有在位模式下向左或向右移位的运算符。例如,0xF << 2将得到二进制数字为0...0111100。Java中共有两个右移运算符,其中 >> 是将符号位扩展到顶部,而 >>> 则会用0来填充顶部的符号位。如果你在程序中进行移位运算,那么你必须要知道这意味着什么;如果你并不了解移位运算,那么也就表明你可能不需要使用这些运算符了。

警告:如果移位运算符号的左操作数是int类型,那么右操作数的模是32;如果左操作数是long类型,那么右操作数的模是64。例如,1 << 35的值与1 << 3或8 相同。

提示:当 &(位与)和 |(位或)运算符应用于boolean值时,在计算结果之前将会对两个操作数进行强制求值。当然,这种用法非常罕见。加入右操作数没有副作用,它们就像 && 和 || 一样,只是效率较低。除非确实需要强制对第二个操作数求值,并将其赋值给一个boolean变量,以使得执行流程清晰可见。