如果在圆括号内的赋值情况下条件评估为真或假,该怎么办?
我在学习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后面时可能会发生什么?