(没学过汇编)
int i=0;
i=i++;
下面是汇编结果:
movl $0, 12(%esp) //定义个变量12并赋值(val:0)
movl 12(%esp), %eax//把12放到运算寄存器eax(val:0)
leal 1(%eax), %edx//把运算寄存器eax(val:0)+1然后放到结果寄存器edx(val:1)里
movl %edx, 12(%esp)//把结果寄存器edx(val:1) 赋值给变量12(val:0->1)
movl %eax, 12(%esp)//把运算寄存器eax(val:0)赋值给变量12(val:1->1)
我们试试别的
int i=0;
i++;//++i也是这个汇编结果
下面是汇编
movl $0, 12(%esp)//定义个变量12并赋值(val:0)
addl $1, 12(%esp)//直接使用运算寄存器将1加到变量12里(0-1)
我们再换换
int i=0;
int b=0;
b=i++;
下面是编译
movl $0, 12(%esp)//定义个变量12并赋值(val:0)
movl $0, 8(%esp)//定义个变量8并赋值(val:0)
movl 12(%esp), %eax//把12放到运算寄存器eax(val:0)
leal 1(%eax), %edx//把运算寄存器eax(val:0)+1然后放到结果寄存器edx(val:1)里
movl %edx, 12(%esp)//把结果寄存器edx(val:1) 赋值给变量12(val:0->1)
movl %eax, 8(%esp)//把运算寄存器eax(val:0)赋值给变量8(val:1->1)
总结:
其实i++或者++i,只有单句的话执行是add加法运算,如果i++有赋值动作的话类似于下列代码:
var result,temp;
int i=0;
temp=i;
result=temp+1;
i=result;
i=temp;//以上是i=i++;
简单说其实i=0;i=i++就是i=1然后i=0,其实i++这个i就已经变成了+1的结果了,但是呢加完后回写了没运算的值