4

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

false && getName();

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

false & getName();

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

谢谢

4

5 回答 5

5

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

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

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

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

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

为了回答您的最后一个问题(如果 LHS 失败,您什么时候想要评估 RHS),在某些情况下可以。但是,在任何情况下,都可以在不失去可读性的情况下防止这些情况(请参阅jocelyn 的回答,了解确保对两个表达式都进行评估的好方法)。事实上,我认为 jocelyn 的方式比if (exprA() & exprB()) { ... }.

&就个人而言,除非我真的需要按位与,否则我从不使用。

于 2012-06-21T10:22:19.160 回答
3

什么时候不应该使用 Java 快捷操作符 &

这是一个奇怪的问题。我能想到的最佳答案是,如果您确实想要&&. (这是大多数时候......)

当然,对正在运行的 RHS 评估的任何依赖都是不好的编码实践吗?

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

我承认你很少需要&在布尔表达式中使用,但这并不意味着使用它们是不好的做法。

于 2012-06-21T10:23:29.767 回答
2

事实上,依赖 RHS 的电话是不好的做法。如果您每次都需要调用它,请在之前调用它,存储结果并在比较表达式中使用它。

if (false && getresult()) {

}

变成

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

}
于 2012-06-21T10:12:44.497 回答
1

它用于按位与运算

例如

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

基本上 & 会进行逻辑与运算,因此如果您想同时评估条件然后对它们进行与运算,那么您可以使用

于 2012-06-21T09:59:52.687 回答
1

另一个典型的使用案例是您要检查两个计算条件:

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

在这个例子中不管值的i j增加。

请记住,这可以通过其他方法实现。它为您节省了几行代码。作为一种语言,也可以很好地提供评估两者的机会。否则有人可能会问我为什么不能。

于 2012-06-21T10:10:57.930 回答