java operator + =中的隐式转换
我发现java编译使用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中发布此代码块
http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.26.2
Java语言规范说:
forms
E1 op= E2
的复合赋值表达式等效于E1 = (T) ((E1) op (E2))
,其中T
是E1
的类型,除了E1
仅被评估一次。
所以i += f
等于i = (int) (i + f)
。
我相信明确的i+f
因为缩小原始转换而失败。 在第一种情况下,右侧的转换通过,因为它是根据化合物分配规则完成的。