我的理解是,当使用&&作为Java中的数学运算,如果评估的LHS(左手侧)失败,则不会检查右侧,所以。
false && getName();
getName()永远不会被调用,因为LHS已经失败。
false & getName();
如果我知道LHS失败了,我什么时候才能查看RHS?当然,对运行RHS评估的任何依赖都是不好的编码实践?
谢谢
答案 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) {
}