什么时候不应该使用Java Shortcut Operator&

时间:2012-06-21 09:55:43

标签: java shortcut bitwise-operators

我的理解是,当使用&&作为Java中的数学运算,如果评估的LHS(左手侧)失败,则不会检查右侧,所以。

false && getName();

getName()永远不会被调用,因为LHS已经失败。

false & getName();

如果我知道LHS失败了,我什么时候才能查看RHS?当然,对运行RHS评估的任何依赖都是不好的编码实践?

谢谢

5 个答案:

答案 0 :(得分:5)

&&&的原因不是,一个评估右侧而另一个不评估。

  • &按位运算符,它对两个值进行按位AND运算。它返回一个值。

    理论上,如果左侧的所有位都为0(与false的情况一样),则不能对右侧进行必要的评估。我想这是一个设计决定, 在每种情况下进行评估。在简单的情况下,它比检查左侧是否为0更快。

  • &&是一个条件逻辑运算符,它接受两个布尔值并返回一个布尔值(当且仅当双方都是{{1}时才是true }})。

    这同样适用于此,如果左侧是true,我们不需要检查右侧。在这里,我们决定跳过对这种情况下右侧的评估。

要回答你的最后一个问题(如果LHS失败,你想在什么时候评估RHS),有些情况可以确定。但是,在任何情况下都可以防止这些情况(请参阅jocelyn's answer以确保评估两个表达式的好方法)而不会失去可读性。事实上,我认为jocelyn的方式比false更具可读性。

我个人从不使用if (exprA() & exprB()) { ... },除非我真的需要一个按位AND。

答案 1 :(得分:2)

  

何时不应使用Java Shortcut Operator&

这是一个奇怪的问题。我能想到的最佳答案是,如果你想要&&的短路行为,就不应该使用它。 (这大部分时间都是......)

  

当然,对运行RHS评估的任何依赖都是错误的编码实践?

我不同意。这无异于说副作用是不好的编码实践。

我会告诉你,你很少需要在布尔表达式中使用&,但这并不会使它们成为不好的做法。

答案 2 :(得分:1)

用于按位ANDing

例如

int i = 3; // 11 - binary
int j = 7; / 111 - binary
int k = i &j; // 11 & 111 = 11 = 3 (decimal)

基本上&进行逻辑AND运算,如果你想同时评估条件,然后是AND它们那么你可以使用

答案 3 :(得分:1)

另一种典型的使用方法是您要检查两种计算条件:

if(++i < 0 & ++j < 0)

在此示例中,无论i j值的增加如何。

请记住,这可以通过其他方法实现。它为您节省了几行代码。另外,作为一种语言,很有可能同时评估这两种语言。否则有人可能会问为什么我不能。

答案 4 :(得分:1)

确实依靠RHS的召唤是不好的做法。如果您每次都需要调用它,请先调用它,存储结果并在比较表达式中使用它。

if (false && getresult()) {

}

变为

Boolean result = getresult();
if (false && result) {

}