短路与非短路运营商

kin*_*tik 6 java

我理解下面的差异(至少对于Java):

if( true || false ) // short-circuiting boolean operator
if( true | false )  // non-short-circuiting boolean operator
Run Code Online (Sandbox Code Playgroud)

但我的问题是,在处理布尔表达式时,有没有理由使用非短路运算符?是否有某些性能优势或使用不被视为不良做法?

Eam*_*ain 9

您可能想要使用非短路运算符的一个原因是,如果您某种程度上取决于函数的副作用.例如.

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个并行布尔运算,这非常快.


Pet*_*rey 8

如果您的代码对性能足够敏感并且操作足够便宜,那么使用非短路可能会更快.这是因为使用||涉及执行分支,并且分支预测未命中可能非常昂贵.在|执行计算和检查变量的情况下可以更快,避免分支预测未命中.

注意:这是一种微观优化,除非被多次调用,否则很少会发现差异.


Jig*_*shi 5

唯一不应该使用非短路运算符的地方是当您希望执行第二条语句时,通常在条件语句中不应该出现这种情况

,非短路没有性能,但短路绝对有好处


Ruc*_*era 5

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)

我们现在需要检查双方.


Sur*_*tta 5

我的问题更侧重于找到使用|的好处 什么时候只处理布尔

考虑以下情况

while ( !credentialvalid() | (loginAttempts++ < MAX) ) {

    // tell something to user.

}
Run Code Online (Sandbox Code Playgroud)

在这种情况下 |需要因为我必须增加尝试次数:)