这两天看到一道有趣的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指令和执行步骤的简单注释,深层本屌也不太懂,写多了怕挨喷。
有错误请大神多多指正,感激不尽!!