b = a += a -= a *= a++及c = b *= b += b += --b运算解析

.     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

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值