java bit operator_关于Java:按位运算符和单个&符

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:

Why do we usually use || not |, what is the difference?

我可以使用像&这样的单个与号而不是像&&这样的按位运算符吗? 可能会出现什么样的差异,有没有具体的示例可以清楚地说明此问题?

这听起来可能有点挑剔,但另一个问题是询问/主要编码变体的原因,而这个问题有点"广泛"; 如果给出"为什么我们通常使用||不是|,有什么区别?"这个问题的答案,Hot Licks答案(第二个答案)将(更)不合适。 虽然它在这里提供了(我认为)有价值的附加见解

单个&将始终检查两个条件。如果double &&的值为假,它将在第一个条件之后停止。如果确实只需要1个2的条件为真或假,则使用2是"短路"状态检查的一种方法。

例如:

if (myString != null && myString.equals("testing"))

如果myString为null,则第一个条件将失败并且不会费心检查它的值。这是避免空指针的一种方法。

使用&和|总是对两个操作数求值

使用&&和||时,仅在必要时才评估第二个操作数

这是指向页面的链接,其中包含有关如何使用它们的很好的解释。

Java运算符快速参考

完全正确。 使用"&"," |" 和朋友,如果您想旋转位(例如位图标志)。 使用" &&"或" ||" 如果要评估"如果满足,则满足"条件。 使用后者的一个重要考虑因素是"短路评估",这意味着评估会在遇到确定的" true"或" false"时立即停止。

现在链接指向垃圾邮件

我更新了链接,现在可以使用另一个站点。 感谢您指出了这一点。

其他答案在一定程度上是正确的,但并不能说明全部内容。

首先,加倍的运算符&&和||的功能类似于嵌套的if语句:

if (expression_a && expression_b) {

do_something;

}

相当于

if (expression_a) {

if (expression_b) {

do_something;

}

}

在这两种情况下,如果expression_a评估为false,则将不评估expression_b -一种称为"短路"的功能。 (||情况相似,但头发更复杂。)

此外,在Java中(但在C / C ++中不是),&&和||运算符仅适用于布尔值-您不能在int上使用&&或||。

另一方面,单个运算符&和|是相对"纯"的运算符(相对于它们自己是可交换的和关联的),而没有双运算符的"短路"。此外,它们可以对任何整数类型进行操作-布尔值,字符,字节,短型,整数,长型。它们执行逐位运算-将左操作数的位N与右操作数的位N进行"与"运算或运算,以产生与两个操作数相同的位宽的结果值中的第N位被扩展为适合二进制运算符)。在这方面,它们对boolean的操作只是简并的情况(尽管有些特殊情况)。

通常,在if语句中,将仅使用doubled运算符组合布尔表达式。如果所涉及的布尔表达式是"安全的"(例如,不会导致空指针异常),则使用单个运算符不会带来很大的危害,但是双精度运算符的效率会略高一些,并且经常需要短路(如if (a != null && a.b == 5)中所述),因此养成使用双精度形式的习惯通常是明智的。唯一要注意的是,如果要对第二个表达式求值(因为它是副作用),则doubled运算符将不能保证会发生这种情况。

很好的解释为何单一运算符形式可用于布尔表达式,这有助于我理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值