11

我发现 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中,编译不会发出错误,但计算的结果是带有 value 的 int 3,并且变量i保持 value 3

  • i = i + f表达式中,编译器发出带有“错误:可能丢失精度”消息的错误。

有人可以解释这种行为。

编辑:我已经在https://compilr.com/cguedes/java-autoassignment-error/Program.java中发布了这个代码块

4

2 回答 2

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)

于 2012-12-08T19:37:07.367 回答
0

我相信显式i+f失败是因为缩小原始转换。而在第一种情况下,右侧的转换通过了,因为它是根据复合分配规则完成的。

于 2012-12-08T19:40:25.180 回答