我发现java compile在使用int和float的赋值和自赋值语句方面有一个非期望的行为。
以下代码块说明了错误。
int i = 3;
float f = 0.1f;
i += f; // no compile error, but i = 3
i = i + f; // COMPILE ERROR
在自我赋值i += f
中,编译不会发出错误,但是exaluation的结果是值为3
的int,变量i
维护价值3
。
在i = i + f
表达式中,编译器发出错误“错误:可能丢失精度”消息。
有人可以解释这种行为。
编辑:我已在https://compilr.com/cguedes/java-autoassignment-error/Program.java
中发布了此代码块答案 0 :(得分:11)
http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.26.2
Java语言规范说:
E1 op= E2
形式的复合赋值表达式等同于E1 = (T) ((E1) op (E2))
,其中T
是E1
的类型,但E1
仅被评估一次。
因此i += f
相当于i = (int) (i + f)
。
答案 1 :(得分:0)
我认为明确的i+f
因Narrowing primitive conversion而失败。在第一种情况下,右侧的转换是通过的,因为它是根据Compound Assignment rules.