gpt4 book ai didi

java - 当我们使用赋值而不是比较时,如何评估 if/while 条件?

转载 作者:行者123 更新时间:2023-12-01 06:49:50 24 4
gpt4 key购买 nike

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

下面是第一段代码,其中 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”。

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

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

最佳答案

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

但是赋值运算符

x = y

不仅值从y分配给变量x,而且还返回那个值。

多亏了我们可以编写这样的代码

x = y = z = 1;
//equivalent of:
x = (y = (z = 1));

(尽管不推荐这样做,因为它可能会造成困惑,特别是对于新的 Java 程序员)

如您所见,1 首先分配给变量 z然后 表达式 z = 1 返回 1,可以将其赋值给变量 y。然后再次将 1 分配给 y 返回 1,可以将其分配给变量 x

由于返回机制,可以编写类似 if (b = true) 的代码,因为 true 将被分配给 b 然后返回。由于 if(..) 期望其条件为 boolean 值,并且发现一个代码编译良好。

换句话说,if(b=true){...}if(true){b=true; 非常相似。 ...}。这意味着这样的 if 将始终执行来自 true 分支的代码(因为这是我们分配给 b 的代码)。

<小时/>

奖励:如何防止这种拼写错误?

  • 省略 ==true==false 部分。

    • 如果是 if(b==true) 我们可以写 if(b) 因为 (b == true) 总是给出与已存储在 b 中的结果相同的结果。
    • 如果是 if(b==false),我们可以编写 if(!b)
  • 使用Yoda conditions if(true == b){..} 其中值在 == 的左侧之前/左侧使用,变量在右侧使用。
    即使我们错误地写了 = 而不是 ==,我们最终也会得到 true = b ,这最终会导致编译错误,因为我们不能分配任何东西给,例如true(就像我们无法编译2=3;一样会尝试将 3 分配给 2,这是没有意义的)。我们只能为变量赋值。

关于java - 当我们使用赋值而不是比较时,如何评估 if/while 条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38980041/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com