按位运算符应该传递变量并逐位对它们进行操作 . 在整数,longs,chars的情况下,这是有道理的 . 这些变量可以包含由其大小强制执行的所有值 .
但是,在布尔值的情况下,布尔值只能包含两个值 . 1 =真或0 =假 . 但是没有定义布尔值的大小 . 它可以大到一个字节或一点点 .
那么在布尔值上使用按位运算符会产生什么影响呢? JVM本质上是将它转换为普通的逻辑运算符并继续前进吗?为了操作的目的,它是否将布尔值视为单个位实体?或者结果未定义以及布尔值的大小?
运算符&,^和|当操作数是基本整数类型时,是按位运算符 . 当操作数是布尔值时,它们是逻辑运算符,并且指定了它们在后一种情况下的行为 . 有关详细信息,请参见Java Language Specification的第15.22.2节 .
使用按位运算符可以避免短路行为:
boolean b = booleanExpression1() && booleanExpression2(); boolean b = booleanExpression1() & booleanExpression2();
如果 booleanExpression1() 评估为 false ,那么booleanExpression2() 未在第一种情况下进行评估,并且booleanExpression2() (及其可能产生的任何副作用) is 在第二种情况下评估,
booleanExpression1()
false
booleanExpression2()
除了's covered in the other answers, it'值得注意 && 和 || 与 & 和 | 具有不同的优先级之外 .
&&
||
&
|
从the precedence table中提取(在顶部具有最高优先级) .
bitwise AND & bitwise exclusive OR ^ bitwise inclusive OR | logical AND && logical OR ||
What this means to you?
绝对没有,只要你坚持只有 & 和 | 或只有 && 和 || .
但是,由于 | 具有比 && 更高的优先级(而不是优先级更低的 || ),因此自由混合它们可能会导致意外行为 .
所以 a && b | c && d 与 a && (b | c) && d 相同,而 a && b || c && d 则是 (a && b) || (c && d) .
a && b | c && d
a && (b | c) && d
a && b || c && d
(a && b) || (c && d)
为了证明它们不相同,请考虑真值表的摘录:
a | b | c | d | (b|c) | (a&&b) | (c&&d) | a && (b|c) && d | (a&&b) || (c&&d) F | T | T | T | T | F | T | F | T ^ ^ |- not the same -|
如果您希望OR的优先级高于AND,则可以同时使用 | 和 && ,但不建议这样做 .
但是你真的应该把它们放在括号中,以便在使用不同的符号时澄清优先级,即 (a && b) || c (括号以澄清优先权), a && b && c (不需要括号) .
(a && b) || c
a && b && c
即使它会起作用你也不应该这样做 . 语言规范仅在两个操作数都是原始整数类型或两者都是布尔类型时才定义位运算符 . 我会说,对于任何其他情况,结果都没有定义:
http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#5228
4 回答
运算符&,^和|当操作数是基本整数类型时,是按位运算符 . 当操作数是布尔值时,它们是逻辑运算符,并且指定了它们在后一种情况下的行为 . 有关详细信息,请参见Java Language Specification的第15.22.2节 .
使用按位运算符可以避免短路行为:
如果
booleanExpression1()
评估为false
,那么booleanExpression2()
未在第一种情况下进行评估,并且booleanExpression2()
(及其可能产生的任何副作用) is 在第二种情况下评估,除了's covered in the other answers, it'值得注意
&&
和||
与&
和|
具有不同的优先级之外 .从the precedence table中提取(在顶部具有最高优先级) .
What this means to you?
绝对没有,只要你坚持只有
&
和|
或只有&&
和||
.但是,由于
|
具有比&&
更高的优先级(而不是优先级更低的||
),因此自由混合它们可能会导致意外行为 .所以
a && b | c && d
与a && (b | c) && d
相同,而
a && b || c && d
则是(a && b) || (c && d)
.为了证明它们不相同,请考虑真值表的摘录:
如果您希望OR的优先级高于AND,则可以同时使用
|
和&&
,但不建议这样做 .但是你真的应该把它们放在括号中,以便在使用不同的符号时澄清优先级,即
(a && b) || c
(括号以澄清优先权),a && b && c
(不需要括号) .即使它会起作用你也不应该这样做 . 语言规范仅在两个操作数都是原始整数类型或两者都是布尔类型时才定义位运算符 . 我会说,对于任何其他情况,结果都没有定义:
http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#5228