我知道我们不能在java中的if语句中使用赋值运算符,因为我们在其他几种语言中使用它。
即
int a;
if(a = 1) { }
会出现编译错误。
但以下代码工作正常,如何?
boolean b;
if(b = true) { }
编辑:这是规则,在if语句中不能使用赋值的例外。
答案 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 == c
和b
为c
变量时,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)
。