你知道java中 i=i++后i的值是多少么?之二
来源:网络收集 点击: 时间:2024-04-22如果i++后,不进行赋值操作,i的值为2
下面就来比较一下,这种情况生成的bytecode和上一个有什么不同
先来看看改过后代码吧
Show me the code.
Code:
package chapter4;
/**
* Created by MyWorld on 2016/3/17.
*/
public class IPlusPlusDemo {
public static void main(String args) {
int i = 1;
i++;
System.out.println(i);
}
}

执行上面的代码,看看执行结果会是多少。
终于是2了。和平时的认知保持一致了

看看这种情况的bytecode
命令:
javap -c IPlusPlusDemo.class

生成的btyecode:
Compiled from IPlusPlusDemo.java
public class chapter4.IPlusPlusDemo {
public chapter4.IPlusPlusDemo();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object.init:
()V
4: return
public static void main(java.lang.String);
Code:
0: iconst_1
1: istore_1
2: iinc 1, 1
5: getstatic #2 // Field java/lang/System.out:Ljava/
io/PrintStream;
8: iload_1
9: invokevirtual #3 // Method java/io/PrintStream.printl
n:(I)V
12: return
}

按照上方的经验,找到相关的bytecode如下:
0: iconst_1 //把int型常量1push到栈中,即int 1现在在栈顶了
1: istore_1 //pop出栈顶的1,给i赋值。执行结束后i存放的值为1
2: iinc 1, 1//自增指令。变量i的值++,即当前i的值为2
所以,现在i的值是2了。
当前bytecode的情况和实际执行的结果是一致的

和i=i++时是不是少了两条指令?
少了的两条指令的作用是什么呢?
2: iload_1 //将变量i的值1再压栈,即放到栈顶。这条指令为什么少了呢?是不是进行++运算而进行的特殊处理呢
6: istore_1 //这个就是i=i++中的赋值操作。没有赋值,少了这条指令是对的

版权声明:
1、本文系转载,版权归原作者所有,旨在传递信息,不代表看本站的观点和立场。
2、本站仅提供信息发布平台,不承担相关法律责任。
3、若侵犯您的版权或隐私,请联系本站管理员删除。
4、文章链接:http://www.ff371.cn/art_568061.html