1
public class MyClass
{
    public static void main(String args[])
    {
        Boolean b=false;
        if(b=true)
        {
            System.out.println("TRUE");
        }
        if(b=false){
            System.out.println("FALSE");
        }
    }
}

尽管对于大多数人来说这似乎是一个非常简单的问题,但我无法理解当我运行此代码时输出为 TRUE。

由于=是赋值运算符,因此在这两种情况下它都应该是正确的,因为值是分配的,即if(b=true) = true(有效)和if(b=false) = true(有效)。并且由于在此没有其他条件,因此它应该同时给出 TRUE 和 FALSE 作为输出。

4

7 回答 7

5

这种赋值的返回值总是在它的右边。所以 (b=false) 的结果是假的。

它在此处的 Java 语言规范中定义http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.26

在运行时,赋值表达式的结果是赋值发生后变量的值。

于 2013-04-22T09:20:49.600 回答
2

if(b=false)被评估为假。在这里,您将 false 的值分配给变量b。所以它变成if(false)了这意味着该if块没有被执行。

于 2013-04-22T09:21:42.450 回答
2

你的想法基本上是正确的。但是,如果赋值成功,则不返回 true,如果不成功,则返回 false(实际上,赋值不可能不成功;无效的赋值要么是语法错误,要么抛出异常)。

相反,分配返回已分配的值。

所以b = true返回trueb = false返回false。这就是为什么您的第二个条件不成立的原因。

于 2013-04-22T09:22:40.080 回答
1
if(b=true)

表示truevalue 已设置为b,现在括号中b的 value 将被替换,因此 JVM 将其视为

if(true) //变量b替换为它的值。

这就是为什么您会得到 JVM 所期望的输出。=是赋值运算符。我们必须使用==运算符来比较布尔值。

于 2013-04-22T09:28:46.200 回答
0

条件语句必须计算为布尔类型。因此,在评估条件语句时,b 中包含的值会自动取消装箱,并且其工作方式与原始类型 boolean 的工作方式相同。因此,由于 if(b=true) 为真,因此它返回该值。它评估为 if(true) 将 true 的值分配给变量 b 和 if(b=false),将 false 的值分配给变量 b 并退出,因为它是 false。

于 2013-04-22T09:58:48.100 回答
0
if(b=false)

不同于

if(b == false)

if(b==false) 检查 b 是否为假而不是进入 if 部分,但是 if(b=false) aqssigns 给 ba 为假,然后不进入 if 部分,因为它是假的。

于 2013-04-22T09:29:07.157 回答
0

if 语句的内部部分仅在其为 true 时执行,即 if (true) 内部语句执行 if(false) 内部语句在第二个 if 语句中不执行你将 false 分配给 b 所以它不执行...

于 2013-04-22T09:29:45.723 回答