如果条件在圆括号内分配的情况下评估为true或false,该怎么办?

Moh*_*ikh 0 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");
}
Run Code Online (Sandbox Code Playgroud)

现在这令人惊讶的输出是"真实的".

我了解到必须有一个关系条件,它返回真或假if (a > b)或类似if (a != b).

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

Psh*_*emo 6

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

x = y
Run Code Online (Sandbox Code Playgroud)

不仅指定yto的值x,它还返回该值.多亏了我们可以做的事情x=(y=1)(我们甚至可以在这里删除括号)将分配1y,然后返回1将被分配给x.

在你的情况下,if (b = true)第一个true将被分配给b那么它将被返回,所以你最终得到if(true)所以它将始终从分支执行该布尔值的代码.


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

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

  • as if (b){..}- 因为我们b == true总是b跳过== true部分.if可以使用值b代替评估b == true.当我们想要使用否定而不是==false我们可以写if(!b){..}
  • 使用尤达条件 if(true == b){..} -如果错误地,我们将使用=的,而不是==我们将得到编译错误,这将告诉我们吧,因为我们不能指定任何东西的价值一样true,我们只能赋值的变量.