关于自增的困惑,求详解

 

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

 上面输出的结果还是10,求具体代码实现原因。

这个问题只凭想象很难理解,看看字节码怎么执行就能明白了,通过javap命令得到字节码如下:
public static void main(java.lang.String[]);
Code:
0: bipush 10 //将10推到栈顶
2: istore_1 //将栈顶int型数值存入第二个本地变量

3: iconst_0 //将int型0推送至栈顶
4: istore_2 //将栈顶int型数值存入第三个本地变量
5: goto 16 //跳转
8: iload_1 //将第二个int型本地变量推送至栈顶

9: iinc 1, 1 //将指定int型变量增加指定值(i++, i--, i+=2)

12: istore_1 //将栈顶int型数值存入第二个本地变量

13: iinc 2, 1 //将指定int型变量增加指定值(i++, i--, i+=2)
16: iload_2 //将第三个int型本地变量推送至栈顶

17: bipush 10 //将10推到栈顶
19: if_icmplt 8 //比较栈顶两int型数值大小,当结果小于0时跳转

22: getstatic #16; //Field java/lang/System.out:Ljava/io/PrintStream;
25: iload_1
26: invokevirtual #22; //Method java/io/PrintStream.println:(I)V
29: return

上面我已经添加注释了,其中“a=a++;”这句对应的字节码为:
8: iload_1 //将第二个int型本地变量(a=10)推送至栈顶 ,此时栈顶值为10
9: iinc 1, 1 //将指定int型变量增加指定值(此时a=11),但此时栈顶值不 变,还是10

12: istore_1 //将栈顶int型数值(10)存入第二个本地变量(a=10)

最终a获取栈顶值10

因为a++是a=a+1的简写,而a++表达式的值为自增之前的值,即10,现在把这个值又赋值给了a。
a=a++ <=> a=(a=a+1)

a=a++;

  1. 执行a++ 的结果是 10,假定结果存于临时变量temp中,此时temp==10
  2. 执行完步骤1后,a自增,此时a的值为11
  3. 将10(也就是temp)的值赋值给a,此时a的值重新变为10

注意:temp是不存在的,只是为了方便理解;
第一步和第二步是同时的,拆分开同样是为了方便理解

a=a++;
这个可以分解看
1. b=a++,此时b=10,a=11,
2. a=b 这个时候a=10了,
因此最后还是10

这个是运算符的优先级问题,++(自增运算符)的优先级大于=(赋值运算符),
所以要先做自增再来赋值。
a++表示先使用a的值,a再自增
那么代码中a=a++的意思就是把a自增前的值赋给a,又因为自增操作先做,所以a的值不变

首先要区别 a++ 和 ++a 的不同。

a++ : 先使用a的值,然后a再自增1
++a : a先自增1,再使用a的值。

举个小例:
int a = 10;
int b = a++;//先将a的值赋给b,所以b=a=10.最后a再自增
int c = ++a; //先是a自增1,这时a变成了11,最后再把a赋给b,所以b=a=11

这样解释,应该能理解吧?