1 i++ 和 ++i
1.1 代码
/**
* @author wangsm
* @description i++和++i 字节码角度区别
*/
public class IppTest {
public void testIpp(){
int i = 1;
i++;
}
public void testPpi(){
int i = 1;
++i;
}
}
1.2 字节码
1.2.1 i++字节码
1.2.2 ++i字节码
1.3 结论
i++和++i的字节码没有任何区别,一毛一样。
2 打印i++、++i
2.1 代码
/**
* @author wangsm
* @description i++和++i 字节码角度区别
*/
public class IppTest {
public void testIpp(){
int i = 1;
// 执行结果是 1
System.out.println(i++);
}
public void testPpi(){
int i = 1;
// 执行结果是 2
System.out.println(++i);
}
}
2.2 字节码
testIpp 字节码
字节码解读,先将1压栈,然后赋值给变量表中第一个变量i,然后获取到静态变量out,再获取变量i的值加1(这里只是将局部变量表中a的值加上了1,操作数栈中的1没变),再将操作栈栈顶元素(就是1),传给虚方法println,打印1。
testPpi 字节码
2.2 分析
字节码差不多,唯一不同的是先执行iinc 1 by 1,还是先执行的iload_1,说白了就是,是先将i加1后再压入操作数栈,还是先将a压入操作数栈后再将i加1。
结论
在字节码角度,i++ 和 ++i 是完全一样的。造成结果不同的本质是先将变量入栈,还是先将变量+1。这取决于使用它们的上下文环境。
其他的案列
/**
* @author wangsm
* @description i++和++i 字节码角度区别
*/
public class IppTest {
public static void main(String[] args) {
// 结果:1
System.out.println(testIpp());
// 结果:2
System.out.println(testPpi());
}
public static int testIpp(){
int i = 1;
return i++;
}
public static int testPpi(){
int i = 1;
return ++i;
}
}
字节码对比