【问题标题】:do | and & make any sense in java?做 |和 & 在java中有意义吗?
【发布时间】:2013-02-11 22:47:27
【问题描述】:

我很少碰到 & 和 |其他代码中的逻辑运算符而不是 ||和 &&。我进行了快速研究,因为我从未使用过它们,也不知道它的用途。
A && B 表示如果 A 为假,则不会评估 B,它将返回假。
A & B 表示如果 A 为 false,即使表单也返回 false,也会评估 B。
当然是同一个游戏 |和||。

我的问题是:如果第一个成员确定评估,那么评估第二个成员是否有意义?我可以想象一个代码,其中第二个成员在 clode 中执行了一些非常重要的逻辑,因此应该对其进行评估,但我怀疑这是不好的做法。制作够吗?并且 & 存在?

从评论中说得更清楚:我觉得该程序不是最佳的并且运行良好,或者更好地说:如果必须评估所有逻辑成员,则设计得很好。

【问题讨论】:

标签: java logical-operators


【解决方案1】:

你忘了bitwise operations

按位 & 运算符执行按位与运算。

按位 |运算符执行按位包含 OR 运算。

但在这里你可以找到无条件 AND 运算符更好的例子:

What are the cases in which it is better to use unconditional AND (& instead of &&)

【讨论】:

  • 谢谢,我从来没有在这个级别使用过,并且误解来自我当前项目的一些代码,其中人们将它用作“a!= null & blabla(a)”这没有任何意义我。
【解决方案2】:

单个 & 和 |不是逻辑运算符,它们是 bitwise and logical 运算符。

【讨论】:

  • 它们是按位和逻辑运算符 - spec
【解决方案3】:

来自Bitwise and Bit Shift Operators

按位 & 运算符执行按位与运算。
按位 ^ 运算符执行按位异或运算。
按位 |运算符执行按位包含 OR 运算。

来自JLS 15.22. Bitwise and Logical Operators

位运算符和逻辑运算符包括 AND 运算符 &、异或运算符 ^ 和包含 OR 运算符 |。 块引用

【讨论】:

  • 为什么要截屏这样的代码而不是复制粘贴文本?
【解决方案4】:

您可以使用 |和 & 如上所述的运算符。一些静态代码分析器会警告您,因为它可能会掩盖可能的问题。在您确实希望评估这两个条件的情况下,您可以执行以下操作:

boolean cond1=cond1();
boolean cond2=cond2();
boolean myCond=cond1 && cond2;

如果你只是使用

boolean myCond=cond1()&cond2();

一定有人会为你“纠正”它。 所以是的,有些地方你会使用 & 和 |,但很可能这不是一个好主意,为了清楚起见你可以绕过它。

【讨论】:

  • 是的,这是我发布问题时的唯一猜测。但我有一种感觉,如果所有逻辑成员都必须进行评估,那么程序就不是最优的并且运行良好(更好的是设计得很好)。
【解决方案5】:

想象一下,如果 B 是一个你想一直执行的函数,那么它会很有用。

【讨论】:

  • 是的,但正如我在编辑后的问题中所写:这难道不是程序结构不合理的标志吗?我想说,如果有人改变了一些逻辑评估,这是很常见的,这很容易成为受害者。
【解决方案6】:

我认为这可能是一个很好的例子:

if (initializeConnectionA() & initializeConnectionB() & initializeConnectionC()) {
    performOperation();
} else {
    logger.warn("Not all modules are working properly");
}

方法 initializeConnection 连接到的地方,即一些可能无法正常工作的外部服务器。您可能不需要全部初始化它们,但如果其中一些不起作用,您希望得到警告。

当然,这可能不是解决这个问题最清晰的方法,但这是 & 运算符可能有用的示例。

【讨论】:

  • 对我来说有点臭,即使这个例子真的很好。我的意思是,如果你继续使用这个单一的 & 运算符,肯定会有一个新人必须调试这个函数,并且肯定会通过将它们重写为 && 来制造错误。根据我的口味,我会清楚地将初始化分开,并对状态进行单独的检查。因此,如果有人触及程序的这一部分,就不会错过任何重要的程序部分。
  • 我完全同意,我不会在我的生产代码中这样写。
  • 我认为 |和 & 运算符不如 || 有用和 && 运算符,但比后者更基本,后者是它们的优化版本。而且我认为编程语言应该给我们基本的操作符,如果可能的话,给我们额外的优化操作符。
  • 对,只是因为它是基本的,我不会说它很好。我可以习惯单独写 if for 'a != null' 和 'a.getId() != 0',但它是如此......老派。
猜你喜欢
  • 2011-02-06
  • 2010-11-27
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-05
  • 1970-01-01
相关资源
最近更新 更多