在“if”语句中与==和=混淆

时间:2010-03-06 20:18:41

标签: java compiler-errors scjp

我知道我们不能在java中的if语句中使用赋值运算符,因为我们在其他几种语言中使用它。

            int a;

            if(a = 1) {  } 

会出现编译错误。

但以下代码工作正常,如何?

           boolean b;

           if(b = true) {   }

编辑:这是规则,在if语句中不能使用赋值的例外。

5 个答案:

答案 0 :(得分:39)

因为赋值的“结果”是指定的值...所以它在第二种情况下仍然是boolean表达式。 if表达式要求条件为boolean表达式,第二个但不是第一个满足。实际上,您的两个片段是:

int a;

a = 1;
if (a) { }

boolean b;

b = true;
if (b) { }

从扩展中可以清楚地知道第二个版本将编译而不是第一个版本吗?

这是不直接与真假比较的一个原因。所以我总是只写if (b)而不是if (b == true)if (!b)而不是if (b == false)。当if (b == cbc变量时,boolean}仍会遇到问题,诚然 - 这可能会导致问题。我不能说它曾经发生在我身上。

编辑:响应您的编辑 - 只要整体条件表达式为if,就可以在while语句和boolean循环等中使用所有类型的分配。例如,您可能有:

String line;
while ((line = reader.readLine()) != null)
{
    // Do something with a line
}

虽然我通常在条件中避免副作用,但这个特定的习惯用法通常对上面显示的例子或InputStream.read有用。基本上它是“虽然我读的价值很有用,但请使用它。”

答案 1 :(得分:10)

对于if,您需要一个计算结果为 boolean 的表达式。 b = true评估布尔a = 1评估为 int ,因为作业总是评估为指定的值。

答案 2 :(得分:1)

第二个代码正常工作的原因是因为它将'b'赋值为true,然后比较以查看b是true还是false。您可以这样做的原因是因为您可以在if语句中执行赋值运算符,并且您可以自己与布尔值进行比较。这与if(true)相同。

答案 3 :(得分:1)

在java中,你没有隐式转换。所以非布尔值或不自动转换为布尔值。

在第一种情况下,语句的结果是一个int,它是非布尔值,不起作用。最后一种情况,结果是boolean,可以在if语句中进行求值。

答案 4 :(得分:1)

规则不是“赋值不能在if语句中使用”,而是“if语句中的条件必须是boolean类型”。赋值表达式生成所分配类型的值,因此如果您分配if值,Java仅允许在boolean语句中进行赋值。

这是为什么应该避免使用样式if (foo == true),而只是简单地写if (foo)