这个问题我也遇到过 int i = 0; //1 double j = 3.5; //2 i += j; //3 i = i + j; //4 第3行可以运行,第4行报错,我知道第4应该强转 第3行不知道是什么,但绝对不是自增相当于i = i + j; 也就是第4个表达式 不知道两种写法有什么区别,请高手解答
这个例子必须要充分的 了解 计算机的 运算过程,解释如下: int i = 0; //1 double j = 3.5; //2 i += j; //3 i 等于 i 加上 j i = i + j; //4 i 加上 j 等于 i 如果你还不明白 往下看:计算机的运算 : 第 3 句 明确 指出 int 型 i 等于 i 加 j ,当相加时 因为以知结果是 int型 ,所以 程序自动转换! 第 4 句 程序先 运行 int型 i 加 j,没有给出转换标志,读到这里已经出错,没有向下走!试着用你的脑子运行!
计算机的运算 : 第 3 句 明确 指出 int 型 i 等于 i 加 j ,当相加时 因为以知结果是 int型 ,所以 程序自动转换! 第 4 句 程序先 运行 int型 i 加 j,没有给出转换标志,读到这里已经出错,没有向下走!试着用你的脑子运行!------------------------------------------- 不解,,不理解,,,,
+=自动转了
至于为啥自增运算没有做此种转换,我不清楚了
找找资料看看。
int i = 0; //1
double j = 3.5; //2
i += j; //3
i = i + j; //4
第3行可以运行,第4行报错,我知道第4应该强转
第3行不知道是什么,但绝对不是自增相当于i = i + j; 也就是第4个表达式
不知道两种写法有什么区别,请高手解答
第四行 没有强制转换,所以会报类型不匹配的错误
在例子里面
i+=j其实相当于
Double d=new Double(i+j);
i=d.intValue();
int i = 0; //1
double j = 3.5; //2
i += j; //3 i 等于 i 加上 j
i = i + j; //4 i 加上 j 等于 i 如果你还不明白 往下看:计算机的运算 :
第 3 句 明确 指出 int 型 i 等于 i 加 j ,当相加时 因为以知结果是 int型 ,所以 程序自动转换!
第 4 句 程序先 运行 int型 i 加 j,没有给出转换标志,读到这里已经出错,没有向下走!试着用你的脑子运行!
第 3 句 明确 指出 int 型 i 等于 i 加 j ,当相加时 因为以知结果是 int型 ,所以 程序自动转换!
第 4 句 程序先 运行 int型 i 加 j,没有给出转换标志,读到这里已经出错,没有向下走!试着用你的脑子运行!-------------------------------------------
不解,,不理解,,,,
1: istore_1
2: ldc2_w #2; //double 3.5d
5: dstore_2
6: iload_1
7: i2d
8: dload_2
9: dadd
10: d2i
11: istore_1
12: getstatic #4;
15: iload_1
16: invokevirtual #5;
19: return从字节码中可以看出,i += j 的运算方法:先载入i(第6行),再将i转成double类型,再载入j,进行double的加运算,最终将结果再转化为 int 型(第10行)。JVM 这样做具体的理由嘛,估计跟 lirunjie1124 的解释类似吧。
不错!
i+=j 是把j转换为int形,结果i还是int形.j还是double 形
而
i=i+j 看等式右边就知道这个表达式的结果是一个duoble形,
怎么能让double形的数,赋值于int形呢,这样明显是错误的..
E1 op= E2 等价于 E1=(T)((E1)op(E2))
也即bao110908(bao)(bao)要解释的过程。
i += j; java编译器认为 i 与 j 做 “+=” 操作,运行时做了强制转换。
而 i = i + j 则编译器认为你将一个double的值付给int型变量,出错。
(t)指什么
这里的T是指E1的类型。
其次 i +=j;是在运算过程中强行转换;将i转换成double,这时i是double的,结果是3.5。最后会自动将i的类型还原,就变成3了。类似一下语句:
double k = (double)i + j;
i = (int)k;