=运算符
最近我看到一个代码使用这个:
boolean val = something();
val |= somethingElse();
有趣的部分是在布尔基元类型上生成的| =(二进制样)运算符。
令我惊讶的是,| =存在布尔值,就好像它是整数类型一样,并且搜索此运算符的Java规范,但找不到任何。
我很好奇,如果右操作数被评估,如果左值已经是真的。
有人能指出我对此的Java规范吗?
从JLS:
15.26.2。 复合分配算子
E1 op= E2
形式的复合赋值表达式等价于E1 = (T) ((E1) op (E2))
,其中T
是E1
的类型,只是E1
只计算一次。
15.22.2。 布尔逻辑运算符&
, ^
和|
当&
, ^
或|
两个操作数 运算符的类型为boolean
型或Boolean
型,那么按位运算符表达式的类型为boolean
。 在所有情况下,必要时操作数都将进行拆箱转换(§5.1.8)。
为|
,如果两个操作数的值均为假,则结果值为假; 否则,结果是真实的。
这意味着
val |= somethingElse();
严格等同于
val = val | somethingElse();
(假设somethingElse()
返回boolean
或Boolean
)。
我很好奇,如果右操作数被评估,如果左值已经是真的。
是的,因为|
会被评估 不短路:
15.7.2。 在操作之前评估操作数
Java编程语言保证操作符的每个操作数(除了条件操作符&&
, ||
和? :
除外)似乎在操作的任何部分执行之前都被完全评估。
15.24。 条件或运算符||
因此, ||
计算与|
相同的结果 在boolean
或Boolean
操作数。 它的区别仅在于右边的操作数表达式是有条件地而不是总是被评估的。
有关|
的定义,请参阅http://docs.oracle.com/javase/specs/jls/se5.0/html/expressions.html#15.22.2。 。 有关|=
的定义,请参阅http://docs.oracle.com/javase/specs/jls/se5.0/html/expressions.html#15.26.2。 定义正是你会想到的。
令我惊讶的是缺少||=
运算符。
>>I'd be curious if right operand is evaluated if left value already is true.
按位运算符(如|
, &
,..)在完成前评估双方。
在某些情况下,逻辑运算符(如&&
, ||
,..)可以跳过第二部分的评估。 这被称为short-circuit
。
上一篇: = operator