我在学习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");
}
现在,令人惊讶的输出是真实的"。
我了解到必须有一个关系条件,它同样返回true或false,如if (a > b)
或if (a != b)
。
我想知道它是如何在这种情况下返回true的。它是否调用Boolean.valueOf()?
答案 0 :(得分:6)
=
是赋值运算符,==
是比较运算符。但是
x = y
不仅将y
的值分配给x
,还 返回 该值。多亏了我们可以执行x=(y=1)
之类的操作(我们甚至可以在此处删除括号),这会将1
分配给y
,然后返回将1
分配给x
1}}。
在if (b = true)
的情况下,首先true
会将b
分配给if(true)
,然后会返回,因此您最终会使用==
,因此它始终会执行代码分支该布尔值。
这通常是印刷错误的结果,因为在大多数情况下我们需要=
(相等运算符),而不是if (b){..}
(赋值运算符)。
为了避免这个错误,我们可以编写像
这样的代码b == true
- 由于b
总是== true
,我们会跳过if
部分。 b
可以使用b == true
的值而不是评估==false
。当我们想要使用否定代替if(!b){..}
时,我们可以编写if(true == b){..}
=
- 如果我们错误地使用==
代替true
,我们会收到编辑错误,这会告诉我们相关信息,因为我们可以&#39 ; em 分配值的任何内容,如@RepositoryRestResource
public interface ClientRepository extends CrudRepository< Client , Integer > {
List< Client > findAll( );
}
,我们只能为变量分配值。答案 1 :(得分:2)
这不是一个很好的做法
Boolean.valueOf(b = true),
你应该避免这样做,现在关于问题&gt;
if (b = true)
与
b = true;
if (b)
因此始终满足条件
类似于此。
if (b = false)
永远不会被执行......
附加信息:
通常初级开发人员会犯这样的拼写错误......
有些人在开发历史中,为此找到了解决方案......所谓的JODA条件(称为星球大战中的JODA大师......)
因此,在这种情况下,JODA条件将是安全的,因为您可以尝试:
if (true = b) {
// code here
}
但是自投诉以来这不会编译:
作业的左侧必须是变量
争议仍然是关于如何好的想法,代码更具可读性等等......,
答案 2 :(得分:1)
让我们从查看if
语句的结构开始:
if ( <boolean-expression> ) {
...
}
<boolean-expression>
可以是任何评估为boolean
的表达式。最常见的是,这是一个逻辑表达式,即带有比较运算符和/或某些逻辑运算符的表达式,例如&&
,||
和!
。
但是,表达式可能是对返回boolean
的方法的调用,例如:
if (list.isEmpty()) {
...
}
接下来,让我们看一下赋值表达式。这是一种具有副作用的表达。评估右侧并将其分配到左侧。赋值表达式的值是赋值后变量的值。
在您的情况下,作业为b = true
,因此表达式的值为true
。将其插入第一部分可以解释为什么您会在
b = true
if (b = true) {
...
}
是返回true
的有效布尔表达式,因此代码符合并正确运行。更常见的情况是使用赋值来存储结果以供将来参考,如下所示:
if (b = list.isEmpty()) {
...
}
这使您可以在条件之外引用list.isEmpty()
的结果,而无需再次调用该方法。
注意:虽然条件中的赋值是有效的做法时存在情况,但这种情况并不常见,因此应该对其使用进行大量评论。
答案 3 :(得分:0)
if
需要一个类型为boolean的表达式。
布尔变量的类型为... boolean。
那么,将一个布尔变量放在if?
后面可能会发生什么