++i 先+1后使用,i++先使用后+1
下面看三道经典面试题
-
第一题
int a = 0; for (int i = 0; i < 99; i++) { a = a++; } System.out.println(a);
-
第二题
int b = 0; for (int i = 0; i < 99; i++) { b = ++b; } System.out.println(b);
-
第三题
int a = 0; int b = 0; for (int i = 0; i < 99; i++) { a = a++;
b = a++; } System.out.println(a); System.out.println(b);
_第一题为i++模式,_结果__为 a = 0
第二题为++ i模式,结果为 b = 99
第三题是最容易做错的一道题,b = a++ 等效于 a++;b=a,最终结果为 a = 99,b=98
为了解i = i++ 执行过程,我们简单了解一下栈的规则,我们知道栈是先进后出
下面我们看反编译后的代码
Code: 0: iconst_0 //0放到栈顶
1: istore_1 //把栈顶的值保存到局部变量1,也就是i中
2: iload_1 //把i的值放到栈顶,也就是说此时栈顶的值是0
3: iinc 1, 1 //注意这个指令,把局部变量1,也就是i,增加1,这个指令不会导致栈的变化,也就是说局部变量1,即i此时为1了。
6: istore_1 //把栈顶的值(0)保存到局部变量1,也就是让i为0了,所以最后i为0
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