自增 自减 java和c的区别

 

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

 

你可能感兴趣的:(java)