. java 对于基本数据类型的赋值是很简单的,基本数据存储了实际的数值,而并非指向一个对象的引用,所以在为其赋值的时候,是直接将一个地方的内容复制到另外一个地方。
注意+=、-=、*=这些运算符的运算顺序是从右向左,且这些运算符的优先级低于++、--
程序源码如下:
public class Demo {
public static void main(String[] args) {
byte a;
int b, c, d;
a = 5;
b = a += a -= a *= a++;
System.out.println("b="+b);
c = b *= b += b += --b;
System.out.println("c="+c);
d = c + 2;
System.out.println(a+"|"+b+"|"+c+"|"+d);
System.out.println(d > b ? a : c);
}
}
运行结果:
计算转换关系大致可以理解为:
//b= 5+5-5*5 = -15
b = a += a -= a *= a++;
//c=((-16)+(-15)+(-15))*(-15)=690
c = b *= b += b += --b;
为了让大家更清楚理解程序计算的过程,下面将编译后 的.class 文件进行反编译,通过反编译的源码,就能清晰的理解程序代码的执行过程
package cn.tedu.method;
public class Demo
{
public static void main(final String[] args) {
final int n;
final byte b4;
final byte b3;
final byte b2;
byte a = b2 = (b3 = (b4 = (byte)(n = 5)));
++a;
int b;
a = (byte)(b = (byte)(n + (a = (byte)(b4 - (a = (byte)(b3 * b2))))));
System.out.println("b=" + b);
final int c;
b = (c = b * (b += (b += --b)));
System.out.println("c=" + c);
final int d = c + 2;
System.out.println(a + "|" + b + "|" + c + "|" + d);
System.out.println((d > b) ? a : c);
}
}
所用的反编译工具为:luyten-0.5.4
由于IDE 及版本等问题jd-gui-windows-1.4.0 反编译可能会出现// INTERNAL ERROR // 错误,所有建议使用luyten