JAVA
public class Test {
public static void main(String[] args) {
int i = 1000;
int j = 2000;
int a = i++;
int b = ++j;
}
}
汇编
0: bipush 1000 //
2: istore_1 //设置 i=1000 index=1的本地变量
3: sipush 2000
6: istore_2 //设置j=2000; index=2的本地变量
7: iload_1 //把index=1的数据放入操作栈
8: iinc 1, 1 //把index=1的数据加1
11: istore_3 //把操作栈中数据赋值给a
12: iinc 2, 1 //把index=2的数据加1
15: iload_2 //把index=2的数据放入操作栈
16: istore 4 //把操作栈中数据赋值给b
区别:
a=i++ 表示先把i放入操作栈,后更新i在本地变量的值,最后把操作栈的值(没变动过)赋值给a
b=++i 表示先更新本地变量j,后放到操作栈中,再把操作栈中数据赋值给b
C
int main(void) {
int i = 1000;
int j = 100;
int a = i++;
int b = ++j;
}
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $16, %esp
movl $1000, -20(%ebp) //栈ebp-20位置的值为1000 表示i
movl $100, -16(%ebp) //栈ebp-16位置的值为2000 表示j
movl -20(%ebp), %eax //把栈ebp-20位置的值1000 放入eax
movl %eax, -12(%ebp) //把eax的值放入ebp-12 表示a
addl $1, -20(%ebp) //把栈ebp-20的值+1
addl $1, -16(%ebp) //把栈ebp-16的值+1
movl -16(%ebp), %eax //把栈ebp-16的值放入eax
movl %eax, -8(%ebp) //把eax的值放入栈ebp-8 表示b
addl $16, %esp
popl %ecx
popl %ebp
leal -4(%ecx), %esp
区别:
a=i++ 表示先把i的值赋给a,然后给i加1
a=++i 表示先把i的值加1,然后赋值给a