如果在圆括号内的赋值情况下条件评估为真或假,该怎么办?

我在学习OCA / OCP for Java时发现了这个令人惊讶的事情。

下面是if(测试条件)部分让我感到惊讶的第一段代码。

public class BooleanIf { public static void main(String[] args) { boolean b = false; System.out.println(Boolean.valueOf(b = true)); if (b = true) System.out.println("true"); else System.out.println("false"); } 

现在这令人惊讶的输出是“真实的”。

我了解到必须有一个关系条件, if (a > b)if (a != b)同样返回true或false。

我想知道它是如何在这种情况下返回真实的。 它调用Boolean.valueOf()吗?

=是赋值运算符, ==是比较运算符。 但

 x = y 

不仅要将y赋给 x ,它还会返回该值。 多亏了我们可以做x=(y=1) (我们甚至可以在这里删除括号)这样的东西,它将1分配给y ,然后返回1将分配给x

if (b = true)情况下,第一个true将被赋值给b然后它将被返回,所以你最终得到if(true)所以它总是从分支执行该布尔值的代码。


这通常是印刷错误的结果,因为在大多数情况下我们需要== (相等运算符),而不是= (赋值运算符)。

为了避免这个错误,我们可以写代码

  • if (b){..} – 因为b == true总是b我们跳过== true part。 if可以使用b值而不是评估b == true 。 当我们想使用否定而不是==false我们可以写if(!b){..}
  • 使用Yoda条件 if(true == b){..} – 如果错误地我们将使用=而不是==我们将得到编译错误,这将通知我们,因为我们不能任何 分配给 true ,我们只能为变量赋值

这不是一个很好的做法

Boolean.valueOf(b = true),你应该避免这样做,现在关于问题>

if (b = true)与…相同

 b = true; if (b) 

因此总是满足条件

类似于此。

 if (b = false) 

永远不会被执行……

附加信息:

通常初级开发人员会犯这样的错别字/错误……

一些在开发历史中,它为此提出了一个解决方案……

所谓的JODA-Conditions(就像那些来自星球战争的大师JODA ……)

因此,JODA条件在这种情况下是安全的,因为您可以尝试:

 if (true = b) { // code here } 

但自投诉以来,这将无法编译:

赋值的左侧必须是变量,

争论仍然是关于如何好的想法,代码是否更具可读性等等……,

让我们从查看if语句的结构开始:

 if (  ) { ... } 

可以是任何求值为boolean表达式。 最常见的是,这是一个逻辑表达式,即带有比较运算符和/或某些逻辑运算符的表达式,例如&&|| ,和!

但是,表达式可能是对返回boolean的方法的调用,例如:

 if (list.isEmpty()) { ... } 

接下来,让我们看一下赋值表达式。 这是一种副作用的表达。 评估右侧并将其分配到左侧。 赋值表达式的值是赋值后变量的值。

在您的情况下,赋值是b = true ,因此表达式的值为true 。 将它插入第一部分可以解释为什么你得到你看到的结果 – b = true in

 if (b = true) { ... } 

是一个有效的布尔表达式返回true ,因此代码符合并正确运行。 更常见的情况是使用赋值来存储结果以供将来参考,如下所示:

 if (b = list.isEmpty()) { ... } 

这使您可以在条件之外引用list.isEmpty()的结果,而无需再次调用该方法。

注意:尽管条件中的赋值是有效的实践时存在情况,但它并不常见,因此应该对其使用进行大量注释。

if需要boolean类型的表达式。

布尔变量的类型为… boolean。

那么,当你把一个布尔变量放在if后面时可能会发生什么?