java中i++和++i的区别是啥?由字节码指令分析,并且附上几道面试题.

虚拟机栈

timg.jpg

i++分析

先附上下面一段程序,打印出i的结果是: 0

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

为啥呢,来看一下java的这段程序字节码指令.

 0 iconst_0 //定义一个int类型的变量i
 1 istore_1 //将一个数值从操作数栈存储到局部变量表,相当于给i赋值为0
 2 iload_1  //将i压入操作数栈,此时i为0
 3 iinc 1 by 1 //局部变量表的i加1,变成1
 6 istore_1    //将i从操作数栈取出赋值给局部变量表中的i,此时i变成0
 7 getstatic #2 <java/lang/System.out>
10 new #3 <java/lang/StringBuilder>
13 dup
14 invokespecial #4 <java/lang/StringBuilder.<init>>
17 ldc #5 <i=>
19 invokevirtual #6 <java/lang/StringBuilder.append>
22 iload_1
23 invokevirtual #7 <java/lang/StringBuilder.append>
26 invokevirtual #8 <java/lang/StringBuilder.toString>
29 invokevirtual #9 <java/io/PrintStream.println>
32 return

++i分析

第二段程序

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

与之对相应的字节码指令

 0 iconst_0 //定义一个int类型的变量i
 1 istore_1 //将一个数值从操作数栈存储到局部变量表,相当于给i赋值为0
 2 iinc 1 by 1 //局部变量表的i递增为1
 5 iload_1  //将i压入操作数栈
 6 istore_1 //将i取出赋值给i,任然为既i=1
 7 getstatic #2 <java/lang/System.out>
10 new #3 <java/lang/StringBuilder>
13 dup
14 invokespecial #4 <java/lang/StringBuilder.<init>>
17 ldc #5 <i=>
19 invokevirtual #6 <java/lang/StringBuilder.append>
22 iload_1
23 invokevirtual #7 <java/lang/StringBuilder.append>
26 invokevirtual #8 <java/lang/StringBuilder.toString>
29 invokevirtual #9 <java/io/PrintStream.println>
32 return

面试题

        int a = 0;
        for (int i = 0; i < 99; i++) {
            a = a ++;
        }
        System.out.println(a);

结果:a=0

        int b = 0;
        for (int i = 0; i < 99; i++) {
            b = ++ b;
        }
        System.out.println(b);

结果:b=99

        Integer a = 0;
        int b = 0;
        for (int i = 0; i < 99; i++) {
            a = a ++;
            b = a ++;
        }
        System.out.println(a);
        System.out.println(b);

结果: a=99,b=98

总结

  • 赋值=最后计算
  • =右边的从左到右依次压入操作数栈
  • 实际先算哪个看优先级
  • 自增,自减都是直接修改变量的值,不进入操作数栈
  • 最后赋值之前临时结果都是保存在操作数栈中
# Java  

评论

公众号:mumuser

企鹅群:932154986

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×