在Java中操作者的隐式转换+ =(implicit conversion in java oper

2019-07-04 19:34发布

我发现Java的编译没有关于使用int和一个浮动分配和自我赋值语句非预期的行为。

下面的代码块说明了错误。

    int i = 3;
    float f = 0.1f;

    i += f;              // no compile error, but i = 3
    i = i + f;           // COMPILE ERROR
  • 在自赋值i += f编译不发出一个错误,但是exaluation的结果为具有值的int 3 ,并且变量i维持的值3

  • i = i + f表达的编译器发出了“错误:可能的精度损失”的错误消息。

有人可以解释这种现象。

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

Answer 1:

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)



Answer 2:

我认为,明确i+f失败的原因的限制原语转换 。 而在第一种情况下的右侧的转换传递,因为它是根据完成复合赋值规则。



文章来源: implicit conversion in java operator +=