我在理解这段代码时遇到了一些问题:a|=b
是否相当于a = a || b
?
抱歉,我忘了提及a和b是boolean
值。
对于布尔值,它是相同的。
答案 0 :(得分:3)
没有。这意味着a = a | b
,其中|
是bitwise OR
a || b
logical OR
a
和b
评估为boolean
修改:如果a
和b
为booleans
,那么a | b
和a || b
会产生相同的结果
答案 1 :(得分:3)
为了使答案更加完整,尽管其他人已经回答了,但在你的情况下
a和b是布尔值
这两个是等价的(不同的大差异)意味着它们具有相同的结果:
a || b
和
a | b
如果其中任何一个为true
,则为true
。
但是如果你的变量不是boolean
那么等价也不是真的。
答案 2 :(得分:3)
是的,当两个操作数都是boolean
或Boolean
类型时,它们是等效的。
这是一种特殊情况,其中bitwise or
,|
运算符等同于logical or
运算符||
。
以下是文档的相关部分:JLS 15.22.2
要理解原因,只需将布尔值视为一位,0
或1
。
答案 3 :(得分:3)
“X相当于Y”这样的快捷键很容易记住,但在某些边缘情况下可能会导致错误。因此,我在这里会变得有点迂腐。另外,我只会涵盖|
运算符,因为它已经与||
进行了讨论。
根据§15.26.2 Compound Assignment Operators:
形式E1 op = E2的复合赋值表达式是等价的 到E1 =(T)((E1)op(E2)),其中T是E1的类型,除了E1 仅评估一次。
请注意,存在两个不同之处:演员表和评估数。
该问题声称a
是boolean
值,但无法分配值。我认为它的意思是它是一个声明为boolean
的变量。它也可以是使用不同类型声明的变量,只存储boolean
值。这会影响转换,因为它基于声明的类型,而不是基于执行期间存储在它们中的值的类型。
在更一般的情况下,如果a
是一个带有副作用的表达式,那么评估的数量就很重要。例如,考虑arr[i++] |= b
与arr[i++] = arr[i++] | b
。
答案 4 :(得分:0)
如果a
和b
都是无副作用的(例如,它们都是布尔变量),它们只是等效的。
如果a
或b
有副作用,那么它们就不相同了。
首先,如果b
有副作用,a
是一个简单变量,则a |= b
相当于a = a | b
。 a | b
和a || b
之间的区别在于a | b
将始终评估两个操作数,而如果a || b
变为真,则a
会缩短。
例如,给定以下方法:
static boolean f() {
System.out.println("Boo!");
return true;
}
代码
boolean a = false;
a = a || f();
a = a || f();
将输出Boo!
一次,而
boolean a = false;
a |= f();
a |= f();
将输出Boo!
两次。
其次,如果a
有副作用,a |= b
甚至不再等同于a = a | b
,因为a |= b
只评估a
一次。< / p>
因此(给定数组足够大),在:
之后int i = 0;
arr[i++] = arr[i++] || f();
i
的值为2,而
int i = 0;
arr[i++] |= f();
i
的值为1。