j++与++j的区别

j++和++j的结果都是+1,但是在指令级的操作模式完全不一样

以下代码输出结果为:0

    public static void main(String[] args) {
        int j = 0;
        for(int i = 0; i < 10; i++){
            j= j++; 
        }
        System.out.println(j);
    }

javap -c  类.class会生成以下指令集信息   

 0: iconst_0          //将int型(0)推送至栈顶       

 1: istore_1           //将栈顶int型数值存入下标为1的本地变量

 2: iconst_0          //将int型(0)推送至栈顶

 3: istore_2          //将栈顶int型数值存入下标为2的本地变量

 4: goto          15   //跳转到15行

 7: iload_1           //将下标为1的int型本地变量推送至栈顶

 8: iinc          1, 1    //将下标为1的int型变量增加指定值  (i++, i--, i+=2) 

11: istore_1         //将栈顶int型数值存入下标为1的本地变量

12: iinc          2, 1   //将下标为2的int型变量加1

15: iload_2          //将下标为2的int型本地变量推送至栈顶

16: bipush        100   //将单字节的常量值(-128~127)推送至栈顶

18: if_icmplt     7       //比较栈顶两int型数值大小,当结果小于0时跳转到第【7】行

21: getstatic     #16     // Field java/lang/System.out:Ljava/io/PrintStream;      //获取指定类的静态域,并将其值压入栈顶 

24: iload_1       //将第二个int型本地变量推送至栈顶-------------

25: invokevirtual #22                 // Method java/io/PrintStream.println:(I)V  //调用实例方法

28: return       

重点指令集解析:

iload_1:  j在变量表里面的下标为1,将j的值推到操作数栈中j=0;

iinc :这个操作是在本地变量表里面将j+1;此时j=1;并未改变操作数栈里面j的值

istore_1;     j=j++ ; 将操作数栈里面j的值赋给局部变量表里面的j,此时j=0;

 

 

j++与++j的区别_第1张图片

将j=j++,改为j=++j;

 

 7: iinc          1, 1   //将下标为1的局部变量(j)加1,此时j=1;
10: iload_1           //将下标为1的局部变量(j)推到操作数栈,此时操作数栈里面,j=1;
11: istore_1        //将操作数栈栈顶的值赋给局部变量表中下标为1的局部变量(j)此时j=1;

最后输入的结果为:10

你可能感兴趣的:(java)