++i 和i++
public static void main(String[] args) {
int spi=16;
int spi2 =++spi;
System.out.println(spi);
int sd =16;
sd=sd++;
System.out.println(sd);
}
运行结果:
17
16
使用javap -c 查看:
public class com.company.Main {
public com.company.Main();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: bipush 16 //将16压入操作数栈
2: istore_1 //弹出操作数栈的首位并保存在局部变量的1位置(spi=)
3: iinc 1, 1 //局部变量1位置进行+1操作
6: iload_1 //将局部变量1压入操作数栈
7: istore_2 //弹出操作数栈的首位并保存在局部变量的2位置(spi2=)
8: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;
11: iload_1
12: invokevirtual #13 // Method java/io/PrintStream.println:(I)V
15: bipush 16 //将16压入操作数栈
17: istore_3 //弹出操作数栈的首位并保存在局部变量的3位置(sd=)
18: iload_3 //将局部变量3压入操作数栈
19: iinc 3, 1 //将局部变量3进行+1操作
22: istore_3 //弹出操作数栈的首位并保存在局部变量的3位置(sd=)
23: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;
26: iload_3
27: invokevirtual #13 // Method java/io/PrintStream.println:(I)V
30: return
}
从0–> 6 和 15–>19 可以得到
++i 操作是先局部变量+1再压栈操作,
i++ 是直接压栈后局部变量自+1
i++的操作直接导致操作栈数没有进行+1操作;可以认为是个临时变量。
所以得出: i++和++i并没有赋值先后顺序的说法,不管 s=i++
还是s=++i
,都是先进行自增++运算,再进行赋值;只是两次赋值使用的值是不一样的,一个是使用自增后的值,一个是使用临时变量的值.