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

时间:2016-08-16 16:29:49

标签: java if-statement

我在学习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()?

4 个答案:

答案 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){..}
  • 使用Yoda conditions = - 如果我们错误地使用==代替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?

后面可能会发生什么