熟悉c/c++中的i++和++i,那么你知道下面的java代码效果是什么吗?
一 、 代码示例
/** * * @author elelule * */ public class TestPlusPlusOperator { public void test1() { int i = 0; i = i++; System.out.println(i); } public void test2() { int i = 0; i = ++i; System.out.println(i); } }
二、 输出结果
0 1
三、 字节码
public void test1(); Code: 0: iconst_0 1: istore_1 2: iload_1 //将存储栈帧中1号单元的 i load 到操作数栈帧上 3: iinc 1, 1 //将存储栈帧中的1号单元中的数据加 1 6: istore_1 //将操作栈帧上的数据存保存到存储栈帧的1号单元中 7: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; 10: iload_1 11: invokevirtual #3 // Method java/io/PrintStream.println:(I)V 14: return public void test2(); Code: 0: iconst_0 1: istore_1 2: iinc 1, 1 // 将存储栈帧中的1号单元中的数据加 1 5: iload_1 // 将存储栈帧中的1号单元中的数据load 到操作数栈帧上 6: istore_1 // 将操作栈帧中的数据保存到存储栈帧中的 1 号单元中 7: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; 10: iload_1 11: invokevirtual #3 // Method java/io/PrintStream.println:(I)V 14: return
四 、 总结
从上面的字节码可以看到,i=i++; 这条语句被字节码翻译成 “先挪走,然后对存储单元中的数据加1,最后把原来的数据再挪回来”,而 i=++i;这条语句被翻译成 “先对存储单元中的数据加1,然后挪走,最后再挪回来”。是不是c/c++中的不一样呢?当然!你可以试试这两个语句在c语言中输出的结果,还是相当然?