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