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

sul*_*lai 5 java primitive

可能重复:
Java + =运算符

代码示例:

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

那么为什么不产生错误(即使在运行时也f+=d 没有),虽然这会降低精度d

kos*_*osa 5

根据JLS 15.26.2

形式E1 OP = E2中的化合物,赋值表达式等价于E1 =(T)((E1)OP(E2)),其中T是E1的类型,不同的是E1只计算一次.

这意味着:

f += d;
Run Code Online (Sandbox Code Playgroud)

会变成

f = (float) (f+d);


Pet*_*rey 4

复合赋值会进行隐式转换。

a #= b;
Run Code Online (Sandbox Code Playgroud)

相当于

a = (cast to type of a) (a # b);
Run Code Online (Sandbox Code Playgroud)

另一个例子

char ch = '0';
ch *= 1.1; // same as ch = (char)(ch * 1.1);
// ch is now '4'
Run Code Online (Sandbox Code Playgroud)