我的理解是,在Java中使用&&作为数学运算时,如果评估的LHS(左侧)失败,则不会检查右侧,所以。
false && getName();
getName() 永远不会被调用,因为 LHS 已经失败了。
false & getName();
如果我知道 LHS 失败了,我什么时候想检查 RHS?当然,对正在运行的 RHS 评估的任何依赖都是不好的编码实践吗?
谢谢
我的理解是,在Java中使用&&作为数学运算时,如果评估的LHS(左侧)失败,则不会检查右侧,所以。
false && getName();
getName() 永远不会被调用,因为 LHS 已经失败了。
false & getName();
如果我知道 LHS 失败了,我什么时候想检查 RHS?当然,对正在运行的 RHS 评估的任何依赖都是不好的编码实践吗?
谢谢
那么原因&
和&&
不是,一个评估右侧而另一个不评估。
&
是一个按位运算符,它对两个值进行按位与。它返回一个值。
理论上,如果左侧的所有位都为 0(如 的情况false
),则不必评估右侧。我想这是一个设计决定,它在每种情况下都会被评估。在简单的情况下,它比检查左侧是否为 0 更快。
&&
是一个条件逻辑运算符,它接受两个布尔值并返回一个布尔值(即true
当且仅当双方都是true
)。
这里同样适用,如果左边是false
,我们不需要检查右边。在这种情况下,决定跳过右侧的评估。
为了回答您的最后一个问题(如果 LHS 失败,您什么时候想要评估 RHS),在某些情况下可以。但是,在任何情况下,都可以在不失去可读性的情况下防止这些情况(请参阅jocelyn 的回答,了解确保对两个表达式都进行评估的好方法)。事实上,我认为 jocelyn 的方式比if (exprA() & exprB()) { ... }
.
&
就个人而言,除非我真的需要按位与,否则我从不使用。
什么时候不应该使用 Java 快捷操作符 &
这是一个奇怪的问题。我能想到的最佳答案是,如果您确实想要&&
. (这是大多数时候......)
当然,对正在运行的 RHS 评估的任何依赖都是不好的编码实践吗?
我不同意。这无异于说副作用是不好的编码习惯。
我承认你很少需要&
在布尔表达式中使用,但这并不意味着使用它们是不好的做法。
事实上,依赖 RHS 的电话是不好的做法。如果您每次都需要调用它,请在之前调用它,存储结果并在比较表达式中使用它。
if (false && getresult()) {
}
变成
Boolean result = getresult();
if (false && result) {
}
它用于按位与运算
例如
int i = 3; // 11 - binary
int j = 7; / 111 - binary
int k = i &j; // 11 & 111 = 11 = 3 (decimal)
基本上 & 会进行逻辑与运算,因此如果您想同时评估条件然后对它们进行与运算,那么您可以使用
另一个典型的使用案例是您要检查两个计算条件:
if(++i < 0 & ++j < 0)
在这个例子中不管值的i
j
增加。
请记住,这可以通过其他方法实现。它为您节省了几行代码。作为一种语言,也可以很好地提供评估两者的机会。否则有人可能会问我为什么不能。