按位运算符(&、XOR、<<、...)- 1

“嗨,阿米戈!”

“再上一节关于按位运算符的小课。”

“你知道,除了逻辑运算符AND(&&)、OR(||)和NOT(!)之外,还有按位运算符AND(&)、OR(|)、NOT(~)、XOR(^ ), 正确的?”

“是的。Bilaabo 曾经就此给过很好的教训。”

“嗯,关于这些操作员。我有两件事要告诉你:”

“首先,除了 NOT (~),它们可以应用于布尔变量,就像逻辑运算符一样。”

“其次,惰性评价不适用于他们。”

“看这个例子:”

代码 等效代码
if (a != null && a.getName() != null && c != null)
{
 c.setName(a.getName());
}
if (a != null)
{
 if (a.getName() != null)
 {
  if (c != null)
  {
   c.setName(a.getName());
  }
 }
}

“左边比右边紧凑吗?”

“是的。”

“它的意思是一样的吗?”

“是的。”

“非常正确。但现在使用按位运算符查看相同的表达式:”

代码 等效代码
if (a != null & a.getName() != null & c != null)
{
 c.setName(a.getName());
}
boolean c1 = (a != null);
boolean c2 = (a.getName() != null);
boolean c3 = (c != null);
if (c1)
{
 if (c2)
 {
  if (c3)
  {
   c.setName(a.getName());
 }
 }
}

“换句话说,代码是一样的,但绝对会执行每一个操作。”

“注意,如果a为null,计算c2时会抛出异常!”

“啊,我现在看得更清楚了。”