首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >短路与非短路操作

短路与非短路操作
EN

Stack Overflow用户
提问于 2013-08-21 05:16:23
回答 8查看 6.2K关注 0票数 7

我理解下面的区别(至少对于Java来说是这样):

代码语言:javascript
复制
if( true || false ) // short-circuiting boolean operator
if( true | false )  // non-short-circuiting boolean operator

但我的问题是,在处理布尔表达式时,是否有任何理由使用非短路运算符?是否有一些性能上的好处或使用不被认为是不好的练习?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2013-08-21 05:25:15

您可能希望使用非短路运算符的一个原因是,如果您在某种程度上依赖于函数的副作用。例如。

代码语言:javascript
复制
boolean isBig(String text) {
  System.out.println(text);
  return text.length() > 10;
}

...
if( isBig(string1) || isBig(string2) ){
   ...
}

如果您不关心是否执行println,那么您应该使用如上所述的短路操作。但是,如果希望始终打印这两条字符串(因此取决于副作用),则需要使用非短路操作符。

实际上,你几乎总是想使用短路操作器.在表达式中依赖副作用通常是不好的编程实践。

一个例外是在非常低级别或性能敏感的代码中。短路运算符可能会稍微慢一些,因为它们会导致程序执行中的分支。此外,使用按位运算符可以作为单个整数操作执行32或64并行布尔操作,这是非常快速的。

票数 11
EN

Stack Overflow用户

发布于 2013-08-21 05:32:25

如果您的代码性能足够敏感,操作也足够便宜,那么使用非短路可以更快。这是因为使用||涉及到执行分支,而分支预测丢失可能非常昂贵。当|执行计算和检查变量时,速度可能要快得多,从而避免了分支预测的失败。

注意:这是一种微优化,除非它被多次、多次调用,否则很少会看到不同之处。

票数 9
EN

Stack Overflow用户

发布于 2013-08-21 05:27:13

我的问题是,在只处理布尔人的情况下,更多地关注如何找到使用x的好处。

考虑以下情况

代码语言:javascript
复制
while ( !credentialvalid() | (loginAttempts++ < MAX) ) {

    // tell something to user.

}

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18349330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档