基元浮动和加倍:为什么f + = d不会导致类型不匹配错误?

时间:2012-12-11 14:48:10

标签: java primitive

  

可能重复:
  Java += operator

代码示例:

    double d = 1;
    float f = 2;
    f += d;  // no error?
    f = f+d; // type mismatch error, should be f = (float) (f+d);

那么为什么f+=d 会产生错误(甚至在运行时都没有),尽管这会降低d的准确性?

3 个答案:

答案 0 :(得分:5)

根据JLS 15.26.2

  

E1 op = E2形式的复合赋值表达式等效于E1 =(T)((E1)op(E2)),其中T是E1的类型,但E1仅被评估一次。

这意味着:

f += d;

将成为

f = (float) (f+d);

答案 1 :(得分:4)

复合赋值执行隐式转换。

a #= b;

相当于

a = (cast to type of a) (a # b);

另一个例子

char ch = '0';
ch *= 1.1; // same as ch = (char)(ch * 1.1);
// ch is now '4'

答案 2 :(得分:2)

有一篇关于这个主题的好文章:Java += and implicit casting