在“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
)的问题,当b
和c
是boolean
变量时,诚然 – 这可能会导致问题。 我不能说它曾经发生在我身上。
编辑:响应您的编辑 – 所有类型的赋值可以在if
语句中使用 – 和while
循环等,只要整个条件表达式是boolean
。 例如,您可能有:
String line; while ((line = reader.readLine()) != null) { // Do something with a line }
虽然我通常避免在条件中产生副作用,但这个特定的习惯用法通常对上面显示的示例或使用InputStream.read
很有用。 基本上它是“虽然我读的价值很有用,但要使用它。”
因为if
你需要一个求值为boolean的表达式。 b = true
evalueates to boolean但a = 1
计算结果为int,因为赋值总是计算为赋值。
第二个代码工作正常的原因是因为它将’b’赋值为true,然后比较以查看b是真还是假。 您可以这样做的原因是因为您可以在if语句中执行赋值运算符,并且您可以单独与布尔值进行比较。 它与if(true)相同。
在java中,您没有隐式转换。 所以非布尔值或不自动转换为布尔值。
在第一种情况下,语句的结果是一个int,它是非布尔值,不起作用。 最后一种情况,结果是boolean,可以在if语句中进行求值。
规则不是“赋值不能在if
语句中使用”,而是“ if
语句中的条件必须是boolean
类型”。 赋值表达式生成所分配类型的值,因此如果您指定了boolean
值,Java仅允许在if
语句中赋值。
这是为什么应该避免样式if (foo == true)
,而只是写if (foo)
一个很好的理由。