Cri*_*scu 26 java precision compiler-errors
可能重复:
Java + =运算符
在Java中,这是无效的(不编译),如预期的那样:
long lng = 0xffffffffffffL;
int i;
i = 5 + lng; //"error: possible loss of magnitude"
Run Code Online (Sandbox Code Playgroud)
但这很好(?!)
long lng = 0xffffffffffffL;
int i = 5;
i += lng; //compiles just fine
Run Code Online (Sandbox Code Playgroud)
这显然是一个缩小的操作,可能超出int范围.那么编译器为什么不抱怨呢?
ass*_*ias 14
这在JLS#15.26.2中定义:
除了仅计算一次之外,表单的复合赋值表达式
E1 op= E2等效于E1 = (T) ((E1) op (E2)),whereT的类型.E1E1
换句话说,i += lng隐式执行演员表.
i += lng; 复合赋值运算符强制隐式转换。
i+=lng;
is same as
i = int(i+lng);
Run Code Online (Sandbox Code Playgroud)
从JLS:
形式为E1 op = E2的复合赋值表达式等效于E1 =(T)((E1)op(E2)),其中T是E1的类型,只是E1仅被评估一次。