自己找答案毕竟限制于自己的水平,
和在高质量社区发帖探讨一下,对问题的理解不是一个层面,我自己结束此贴
https://stackoverflow.com/questions/48497636/understanding-the-difference-between-i-and-i-at-the-assembly-levelrvalue 和 lvalue,需要从汇编层面才能理解到位
Assembly for `a++`:
0x100000f9b <+27>: movl -0x8(%rbp), %ecx # 读 -0x8(%rbp) 进 %ecx 寄存器
0x100000f9e <+30>: addl $0x1, %ecx # %ecx 寄存器 +1
0x100000fa1 <+33>: movl %ecx, -0x8(%rbp) # 读%ecx 寄存器进 0x8(%rbp)
Assembly for `b++`,是和 a++相同的
0x100000f9b <+27>: movl -0x8(%rbp), %ecx # 读 -0x8(%rbp) 进 %ecx 寄存器
0x100000f9e <+30>: addl $0x1, %ecx # %ecx 寄存器 +1
0x100000fa1 <+33>: movl %ecx, -0x8(%rbp) # 读%ecx 寄存器进 0x8(%rbp)
但是不同点在于,赋值过程
`c = a++` ( rvalue )建立 2 个寄存器
0x100000f54 <+36>: movl -0x8(%rbp), %eax // eax = a # 内存值建立临时寄存器 1
0x100000f57 <+39>: movl %eax, %ecx // ecx = 1 # 寄存器 1 建立寄存器 2
0x100000f59 <+41>: addl $0x1, %ecx // ecx = 2 # 寄存器 2 + 1
0x100000f5c <+44>: movl %ecx, -0x8(%rbp) // a = # 寄存器 2 赋值给 a 的内存值
0x100000f5f <+47>: movl %eax, -0x10(%rbp) // c = eax = 1 # 寄存器 1 赋值给结果内存变量
`d = ++b;` (lvalue) 建立一个寄存器
0x100000f62 <+50>: movl -0xc(%rbp), %eax // eax = b = 1 # 内存值建立寄存器 1
0x100000f65 <+53>: addl $0x1, %eax // eax = 2 # 寄存器+1
0x100000f68 <+56>: movl %eax, -0xc(%rbp) // b = eax = 2 # 寄存器赋值给内存
0x100000f6b <+59>: movl %eax, -0x14(%rbp) // d = eax = 2 # 寄存器赋值给结果内存变量