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

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

那是

int a; if(a = 1) { } 

会给出编译错误。

但是下面的代码工作得很好,怎么样?

  boolean b; if(b = true) { } 

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

因为赋值的“结果”是赋值的值…所以在第二种情况下它仍然是一个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 == c )的问题,当bcboolean变量时,诚然 – 这可能会导致问题。 我不能说它曾经发生在我身上。

编辑:响应您的编辑 – 所有类型的赋值可以在if语句中使用 – 和while循环等,只要整个条件表达式是boolean 。 例如,您可能有:

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

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

因为if你需要一个求值为boolean的表达式。 b = true evalueates to booleana = 1计算结果为int,因为赋值总是计算为赋值。

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

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

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

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

这是为什么应该避免样式if (foo == true) ,而只是写if (foo)一个很好的理由。