如果不是很理解左值、右值可以先去了解一下:
还分不清左值,右值,将亡值?看这里! - 腾讯云开发者社区-腾讯云 (tencent.com)
首先我们实现一个很简单的代码:
int main()
{
int i=0;
int j=++i;//等价于i+=1;j=i;这意味是左值
int k=i++;//操作的是i的一个字面量副本
return 0;
}
注释不是很能说明问题,我们将其进行编译;
值得注意的是,不同优化等级的编译结果是相同的,这也方便我们去比较两者的区别;
main:
push rbp
mov rbp, rsp
//i+=1;
mov DWORD PTR [rbp-4], 0
add DWORD PTR [rbp-4], 1
//j=i
mov eax, DWORD PTR [rbp-4]
mov DWORD PTR [rbp-8], eax
//eax是原值保留的副