i += i > 0 ? i++ : i--; 运算逻辑的深入思考

这两天看到一道有趣的java运算题,如下图;

输出结果呢?本屌感觉不会那么简单但是也看不透彻,姑且猜测为0,程序输出果然为0;

先心底暗爽一下毕竟蒙对了也是一种运气(o不实力的体现,自我安慰)


但是搞不懂心理有死结就决定一探究竟。 从代码字面来看结果为0的计算顺序应该是

先执行(i>0?i++:i--)  后执行 (i+=(i>0?i++:i--))>0?i++:i--  ;

到这姑且多少学到了一些东西,但是感觉还有一层迷雾遮盖着真相,想到之前的类似 的题目

i=i++和i=++i这样的问题,反编译代码查看jvm的指令以及顺序更能透彻理解所以把这个类反编译了之后如下

static void test();
    Code:
       0: iconst_0                       //int类型的常量0入栈
       1: istore_0                       //int类型的常量0存储赋值 既 i=0
       2: iload_0                        //将常量0推至栈顶 既i+ =中i索引0 的常量值
       3: iload_0                        //将常量0推至栈顶 既是 i>0 中i索引0的常量值  
       4: ifle          14               // ifle 是jvm指令常量小于等于0时跳转执行到指令号 14
       7: iload_0                        //继续执行推栈操作 一直代表的i这个常量 
       8: iinc          0, 1             //iinc 是常量自增 代表 指令号为0 的常量值加1既是i++
      11: goto          18               //无条件跳转到指令号为18
      14: iload_0                        //第4指令号为真 执行当前指令 将常量0推至栈顶 
      15: iinc          0, -1            //i+=i之后大于0 所以执行i--  自增为-1 即为0
      18: iadd                           //这一步执行 i+=i  
      19: istore_0                        //存储赋值  既将 指令号为0的常量值重新赋值
      20: getstatic     #2                  // Field 
                                             java/lang/System.out:Ljava/io/PrintStream;
      23: iload_0
      24: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
      27: return
     
       20 23 24 27 大家可以去看jvm指令集,不一一赘述,怕有误导
      

对于jvm指令和执行步骤的简单注释,深层本屌也不太懂,写多了怕挨喷。

有错误请大神多多指正,感激不尽!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值