a++与++a的区别大家都应该区别在哪了吧
int a = 1;
int c = a++;
int b = 1;
int d = ++b;
那么 a、c、b、d的值是什么? 2,1,2,2
比较好奇类似于a++,++c都干了些什么事儿,贴代码
a++;
c = a;
//代码的左边是汇编,右边是还原的伪代码
0x1076a8522 <+34>: movl $0x1, -0x14(%rbp) ; a = 1;
0x1076a8529 <+41>: movl -0x14(%rbp), %edi ; edi = a;
0x1076a852c <+44>: movl %edi, %ecx ; ecx = edi;
0x1076a852e <+46>: addl $0x1, %ecx ; ecx = ecx + 1;
0x1076a8531 <+49>: movl %ecx, -0x14(%rbp) ; a = ecx;
0x1076a8534 <+52>: movl %edi, -0x18(%rbp) ; c = edi;
最终 a的值已经是2了,但是c的值并不是a,而是edi,edi 的值为1;
下一次再访问a 的时候,edi = a; 会得到计算后的结果。
++b;
d = b;
//代码的左边是汇编,右边是还原的伪代码
0x1076a8551 <+81>: movl $0x1, -0x1c(%rbp) ; b = 1;
0x1076a8558 <+88>: movl -0x1c(%rbp), %ecx ; ecx = b;
0x1076a855b <+91>: addl $0x1, %ecx ; ecx = ecx + 1;
0x1076a855e <+94>: movl %ecx, -0x1c(%rbp) ; b = ecx
0x1076a8561 <+97>: movl %ecx, -0x20(%rbp) ; d = ecx;
最终发现b、d都会ecx,ecx的值就是2。
经过以上的汇编代码,可以看出,a++在执行之后a的值已经改变了为2,但返回的是执行++ 操作之前a的值为1。
如果有第二次访问 a 时,或者执行a++时候,返回的是当前(当前,当前)未执行操作的a值,也就2。
++a在执行之后a的值会改变,a返回的值也会改变。