布尔值False等于True吗?

5

我在一本书中找到了这段代码,并在Netbeans中执行了它:

boolean b = false;
if(b = true) {
    System.out.println("true");
} else {
    System.out.println("false");
}

我不明白为什么这段代码的输出值是true,能有人解释一下吗?谢谢。

7
这段代码还展示了为什么测试布尔值是否等于true或者false不仅毫无意义,而且很危险。 - user207421
7个回答

13

这里缺少双等号。所以它执行的是一个赋值语句而不是一个相等比较(请记住,赋值语句的返回值是新值)。在大多数情况下,大多数类型不是布尔类型,这意味着结果不是布尔类型,因此对于 if 语句,它会导致编译错误。然而,由于这里的类型已经是布尔类型,赋值操作的结果为布尔类型,因此安全检查失败。因此,b = true 表示将值 true 赋给变量 b,并且这个值被返回并由 if 语句检查。


4
这是因为if语句的条件不是比较语句,而是一个赋值语句:
if(b = true)

这将始终返回true。因此,它将始终打印true

如果您想进行比较,则需要使用 ==


1
如果你没有收到关于这个的警告,那么你的编译器/IDE警告设置需要调高。 - Ted Hopp
@Nik 一般来说,你不应该尝试编写那样的晦涩代码。虽然它可能对你很方便,但很容易让下一个阅读你代码的人感到困惑。 - Mysticial
如果按照规范来写注释,我并不觉得有什么问题。冗长的代码并不总是好的......想想如果你有很多需要快速运算的专业计算,我很惊讶看到一个测试用例失败了。 - niken
@Nik,请理解短并不等于快。而且我们已经偏离了主题。这与我的回答有什么关系呢? - Mysticial
不,那不是它的工作方式。赋值操作总是“成功”的。但是赋值运算符返回被赋值的值。if语句然后获取该值。由于它分配了true并返回true,因此进入if语句并打印true。 - Mysticial
显示剩余2条评论

2

在您的“if”语句中,您将值“true”分配给b。您应该使用比较运算符“==”来检查该值。

boolean b = false;

if(b == true)
{
   System.out.println("true");
}
else
{
   System.out.println("false");
}

1
 if(b = true)

这是真的,因为“=”是赋值运算符而不是相等运算符“==”。


0

if (b = true) 将值 true 赋给 b,然后基于这个真值执行操作。这就是类 C 语言的危险之处,如果你在本意是比较时漏掉了第二个 =,就会得到一个赋值而不是预期的比较,从而导致意外结果。


0

这是因为它是一个赋值操作。你不需要对 b 进行检查,只需将 true 赋值给它即可。


0

想象一下 int x 有两个可能的值,要么是1,要么是0。如果 x = 1,则执行此操作。否则,(x = 0)则执行其他操作。布尔值只是表示它是一个条件,或者不是该条件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接