我理解下面的差异(至少对于Java):
if( true || false ) // short-circuiting boolean operator
if( true | false ) // non-short-circuiting boolean operator
Run Code Online (Sandbox Code Playgroud)
但我的问题是,在处理布尔表达式时,有没有理由使用非短路运算符?是否有某些性能优势或使用不被视为不良做法?
您可能想要使用非短路运算符的一个原因是,如果您某种程度上取决于函数的副作用.例如.
boolean isBig(String text) {
System.out.println(text);
return text.length() > 10;
}
...
if( isBig(string1) || isBig(string2) ){
...
}
Run Code Online (Sandbox Code Playgroud)
如果您不关心是否println执行,那么您应该使用上述的短路操作.但是,如果您希望始终打印两个字符串(因此取决于副作用),则需要使用非短路操作符.
实际上,您几乎总是希望使用短路运营商.依赖于表达式中的副作用通常是糟糕的编程习惯.
一个例外是非常低级别或性能敏感的代码.短路运算符可能稍微慢一点,因为它们会导致程序执行中的分支.同样使用按位运算符允许您作为单个整数运算执行32或64个并行布尔运算,这非常快.
如果您的代码对性能足够敏感并且操作足够便宜,那么使用非短路可能会更快.这是因为使用||涉及执行分支,并且分支预测未命中可能非常昂贵.在|执行计算和检查变量的情况下可以更快,避免分支预测未命中.
注意:这是一种微观优化,除非被多次调用,否则很少会发现差异.
short-circuit,这意味着如果没有必要,他们不评估右侧.作为一个例子,如果&&左侧是假的,则无需评估右侧.换句话说,||如果左边是真的,则不需要评估右手边的一个.
non-short 始终评估双方.
显然,short-circuit运营商有一个好处.
并且非短的好处,可以在这里找到答案.Java/Scala中的非短路逻辑(布尔)运算符有很好的用途吗?
考虑这个例子
while (status){ // status is boolean value
if(!a | result){// a and result are boolean value
result=getResult(); // result can change time to time
}
}
Run Code Online (Sandbox Code Playgroud)
我们现在需要检查双方.
我的问题更侧重于找到使用|的好处 什么时候只处理布尔
考虑以下情况
while ( !credentialvalid() | (loginAttempts++ < MAX) ) {
// tell something to user.
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下 |需要因为我必须增加尝试次数:)
| 归档时间: |
|
| 查看次数: |
3782 次 |
| 最近记录: |