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++;
注意: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
这样解释,应该能理解吧?