Java:| = b等于a = a || b是否为布尔值?

时间:2014-08-26 08:59:16

标签: java bitwise-operators

我在理解这段代码时遇到了一些问题:a|=b

是否相当于a = a || b

抱歉,我忘了提及a和b是boolean值。

对于布尔值,它是相同的。

5 个答案:

答案 0 :(得分:3)

没有。这意味着a = a | b,其中|bitwise OR

a || b

logical OR ab评估为boolean

修改:如果abbooleans,那么a | ba || b会产生相同的结果

答案 1 :(得分:3)

为了使答案更加完整,尽管其他人已经回答了,但在你的情况下

  

a和b是布尔值

这两个是等价的(不同的大差异)意味着它们具有相同的结果:

a || b

a | b
如果其中任何一个为true,则

true

但是如果你的变量不是boolean那么等价也不是真的。

答案 2 :(得分:3)

是的,当两个操作数都是booleanBoolean类型时,它们是等效的。

这是一种特殊情况,其中bitwise or|运算符等同于logical or运算符||

以下是文档的相关部分:JLS 15.22.2

要理解原因,只需将布尔值视为一位,01

答案 3 :(得分:3)

“X相当于Y”这样的快捷键很容易记住,但在某些边缘情况下可能会导致错误。因此,我在这里会变得有点迂腐。另外,我只会涵盖|运算符,因为它已经与||进行了讨论。

根据§15.26.2 Compound Assignment Operators

  

形式E1 op = E2的复合赋值表达式是等价的   到E1 =(T)((E1)op(E2)),其中T是E1的类型,除了E1   仅评估一次。

请注意,存在两个不同之处:演员表和评估数。

该问题声称aboolean ,但无法分配值。我认为它的意思是它是一个声明为boolean的变量。它也可以是使用不同类型声明的变量,只存储boolean值。这会影响转换,因为它基于声明的类型,而不是基于执行期间存储在它们中的值的类型。

在更一般的情况下,如果a是一个带有副作用的表达式,那么评估的数量就很重要。例如,考虑arr[i++] |= barr[i++] = arr[i++] | b

答案 4 :(得分:0)

如果ab都是无副作用的(例如,它们都是布尔变量),它们只是等效的。

如果ab有副作用,那么它们就不相同了。

首先,如果b有副作用,a是一个简单变量,则a |= b相当于a = a | ba | ba || 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。