【问题标题】:Checking condition safety and evaluating in same if statement检查条件安全性并在相同的 if 语句中进行评估
【发布时间】:2018-04-16 02:44:14
【问题描述】:

检查一个条件是否可以被评估然后在同一个 if 语句中评估表达式是否被认为是一种好的做法,甚至是安全的?

例如:

int[] values = new int[] { 1, 2, 3, 4 }
int index = 4;
if (index < values.length && values[index] == 4) {
    System.out.println("value is 4")
}

在这个例子中,条件是values[index] == 4,我使用index &lt; values.length 来检查调用它是否安全。但是,我在同一个 if 语句中这样做。这样做可以吗?

【问题讨论】:

  • && 和 ||出于这个原因。如果你使用 & 或 |,所有的语句都会被计算。我看不出您的代码有任何缺点。
  • 正如here 所说,是的,它是安全的。只有当第一个条件得到验证时,第二个条件才会被测试
  • 这个例子太短,没有意义,实际用于生产。
  • @AdamSiemion 这是一个演示问题的简短示例,不是吗?这并不意味着它必须有用。

标签: java type-safety


【解决方案1】:

是的,这是正确的方法,因为在 Java 中有一种称为短路评估的机制(也称为惰性评估)。这意味着JVM检查第一个条件,如果这是错误的,JVM知道无论第二个条件是什么结果,它都不会改变任何东西,所以第二个条件被跳过。在您的示例中,如果index 大于values.length,则整个 if 语句为假,因此省略第二个条件。


编辑:

正如Coffee Ninja 所述,位运算符(&amp;,|)和逻辑运算符(&amp;&amp;,||)之间存在显着差异。从技术上讲,结果应该是相同的,但是按位运算符是急切的,所以双方都进行了。这可能会导致您的示例中出现OutOfBoundException
更重要的是,位运算符的优先级较低,所以如果你不小心混合了逻辑运算符和位运算符,你会收到different results

【讨论】:

  • 为了使您的答案更好、更丰富,我建议您添加对按位 &amp; 运算符的引用,它在布尔值上的作用类似于 &amp;&amp;,但它不会短路。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-14
  • 1970-01-01
  • 2017-12-08
相关资源
最近更新 更多