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评估的依赖都是不好的编码实践?
谢谢
那么原因&和&&是不是一个计算右侧,另一个没有.
&是一个按位运算符,它使两个值成为一个按位AND.它返回一个值.
理论上,如果左侧的所有位都为0(如果是这种情况false),则不必对右侧进行评估.我想这是一个设计决定,它在每种情况下都会被评估.在简单的情况下,它比检查左侧是否为0更快.
&&是一个条件逻辑运算符,它接受两个布尔值并返回一个布尔值(即true当且仅当双方都是true).
这同样适用于此,如果左侧是false,我们不需要检查右侧.在这种情况下,我们决定跳过右侧的评估.
并回答你的最后一个问题(如果LHS失败,你想在什么时候评估RHS),有些情况可以确定.但是,在任何情况下都可以防止这些情况(请参阅jocelyn的答案,以确保评估两个表达式),而不会失去可读性.事实上,我认为jocelyn的方式比可读性更强if (exprA() & exprB()) { ... }.
我个人从不使用,&除非我真的需要一个按位AND.