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

dav*_*rld 4 java shortcut bitwise-operators

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

false && getName();
Run Code Online (Sandbox Code Playgroud)

由于LHS已经失败,因此永远不会调用getName().

false & getName();
Run Code Online (Sandbox Code Playgroud)

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

谢谢

bri*_*ium 5

那么原因&&&是不是一个计算右侧,另一个没有.

  • &是一个按位运算符,它使两个值成为一个按位AND.它返回一个值.

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

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

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

并回答你的最后一个问题(如果LHS失败,你想在什么时候评估RHS),有些情况可以确定.但是,在任何情况下都可以防止这些情况(请参阅jocelyn的答案,以确保评估两个表达式),而不会失去可读性.事实上,我认为jocelyn的方式比可读性更强if (exprA() & exprB()) { ... }.

我个人从不使用,&除非我真的需要一个按位AND.

  • &应用于布尔值是一个布尔运算符,就像&&一样.只有在应用于数值时,它才是按位(非"二进制")运算符.布尔值在Java中没有位级表示. (2认同)