关于a++ 与 ++a的窥探

149 阅读1分钟

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返回的值也会改变。