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